Download check digit - Directory Listing

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Programming for Engineers in Python
Recitation 13
Plan
 Error detection
 Luhn Algorithm
 RAID
 Data structures
 Queue
 Stack
 Nested lists
 Matrices
 Recursion
 Even and Odd
 Recursive directory tree walk
2
Teaching Survey
 Please answer the teaching survey:
https://www.ims.tau.ac.il/Tal/
 This will help us to improve the course
 Deadline: 4.2.12
3
Checksums: Check Digit
 A check digit is a form of redundancy check used




4
for error detection
It consists of a single digit computed from the other
digits in the message.
Detect simple errors in the input of a series of digits
Detect a single mistyped digit or some permutations of two
successive digits.
http://en.wikipedia.org/wiki/Check_digit
Luhn Algorithm – “mod 10” Algorithm
 Simple algorithm
 Used to validate:
 Credit Card numbers
 IMEI numbers (GSM SIM card identifiers)
 Israeli ID Cards
 Checks for mistyping errors – not for forgery!
 Designed by Hans Peter Luhn while working in IBM during
the 1950s
 http://en.wikipedia.org/wiki/Luhn_algorithm
5
Luhn: Calculating the check digit
 Double every second digit, starting from the last
 Sum the digits of the doubling product
 Sum the other digits as well
 Multiply results by 9 (67*9=603)
 Return results mod 10 (603%10=3)
6
Luhn: Checking number validity
 Do the same process, add the check digit, and the result
should be 0 mod 10
 Code: Luhn.py
7
XOR – Exclusive Or
 Logic operator on 2 arguments
 “One or the other but not both“
 Results in True:
 If one of the arguments is True and one if False
 Returns False:
 If both arguments are True or both arguments are False
 Examples:
 I’m happy XOR I’m sad
 It’s raining XOR it’s not raining
 http://en.wikipedia.org/wiki/Exclusive_or
8
XOR – Exclusive Or
 “One or the other but not both“
 Bitwise operation (Python ^):
 Returns 1 if the bits are different, 0 if bits are identical
 1 XOR 1 = 0
 1 XOR 0 = 1
 0 XOR 1 = 1
 0 XOR 0 = 0
 1110 XOR 1001 = 0111
 Equivalent to addition without carry
 Useful to calculate parity bit:
 1 XOR 1 XOR 0 XOR 1 XOR 0 = 1
9
RAID Parity
 RAID = redundant array of independent/inexpensive disks
 Storage unit combining multiple drives
 One drive serves as the parity drives and allows the recovery
of lost data
 http://en.wikipedia.org/wiki/RAID#RAID_Parity
10
RAID Parity
Data is written to drives #1-4
Drive #6 is updated to store the parity of drives
#1-4:
00101010 XOR 10001110 XOR 11110111 XOR 10110101 = 11100110
11
RAID Parity
When drive #3 fails, the data can be
recovered by using the same parity
operation with drives #1,2,4,6
00101010 XOR 10001110 XOR 11100110 XOR 10110101 = 11110111
Recovered data is stored in drive #5, the
Hot Spare
When drive #3 is fixed or replaced, it will
be the new Hot Spare
12
RAID in Python
 We will see a simplistic implementation
 Our ‘RAID’ is a matrix of integers
 We will be able to declare a matrix row as ‘faulty’ without
losing its data
 Code: RAID.py
13
Data Structure: Queue
 A Queue is a FIFO data structure
 Items enter in the bottom of the queue and are served from
the top of the queue
 Like standing in line at the bank
 Useful for many applications:
 Phone calls queue in call center or helpdesk
 Passing “tasks” from GUI to computing process
 Code: Queue.py
14
Queue Class
class Queue:
def __init__(self):
self.data = [ ]
def push(self, item):
self.data.append(item)
def pop(self):
return self.data.pop(0)
15
Data Structure: Stack
 A Stack is a LIFO data structure
 Items enter in the top of the queue and are served from the
top of the queue
 Like a pile of dirt clothes…
 Useful for many applications:
 Parsing hierarchical data structures like XML or HTML
 Towers of Hanoi
 Quicksort
 All we do is change the pop method of Queue!
16
Stack Class
class Stack:
…
def pop(self):
return self.data.pop(-1)
17
Flatten Lists
 Assume that we have a hierarchal categorization of objects.
For example:
Fruit
Food
Red
Yellow
Cherry
Strawberry
Banana
Milk
Milki
Milkshake
18
Flatten Lists
 This hierarchy is represented in nested lists as:
['Food',
['fruit', ['Red','[Cherry','Strawberry']],
['Yellow',['Banana']],
['Milk', ['Milki','Milkshake']]
]
 We want to flatten this structure so that all items appear in
one list
['Food', 'fruit', 'Red', 'Cherry', 'Strawberry', 'Yellow', 'Banana',
'Milk', 'Milki', 'Milkshake']
19
Flatten Lists - Code
def flatten(lst):
print lst
flat_lst = [ ]
for x in lst:
if isinstance(x, list):
flat_lst.extend(flatten(x))
else:
flat_lst.append(x)
return flat_lst
20
Nested Lists
 A list of lists
 Example – matrix
 Matrix multiplication: 𝐴 ⋅ 𝐵 𝑖,𝑗 =
𝑘 𝐴𝑖,𝑘
⋅ 𝐵𝑘,𝑗
def mult(A,B):
n = len(A)
k = len(B)
m = len(B[0])
if len(A[0]) != k:
raise ValueError("Matrices must be of appopriate sizes")
C = [ [None]*m for x in range(n)]
for i in range(n):
for j in range(m):
C[i][j] = sum( [ A[i][x]*B[x][j] for x in range(k) ] )
return C
21
Nested Lists
22
>>> A = [ [1,1], [1,0] ]
>>> B = [ [0,1], [1,1] ]
>>> print_matrix(A)
11
10
>>> print_matrix(B)
01
11
>>> print_matrix(mult(A,B))
12
01
def print_matrix(M):
for row in M:
for entry in row:
print entry,
print
print
Simple Recursion Example
 Check if a number is even or odd
23
def even(x):
if x == 0:
return True
else:
return odd(x - 1)
def odd(x):
if x == 0:
return False
else:
return even(x - 1)
http://en.wikipedia.org/wiki/File:Screenshot_Recursion_via_vlc.png
http://paulbutler.org/archives/tail-recursion-in-python/
Simple Recursion Example
>>> even(100)
True
>>> even(101)
False
>>> even(1000)
RuntimeError: maximum recursion depth exceeded
 This was expected…
24
Recursion – find files
 We want to find all mp3 files on the disk
 We’ll do a recursive search on the disk for such files
 First some os commands:
 os.listdir(dir): returns all files and directories in the directory dir
 os.path.isdir(dir): returns True is dir is a name of a directory, False
otherwise
 os.path.join: joins a list of directory names and a file name to a path,
separating the names with a separator suitable for this OS
Windows: c:\examples\python
Unix: /examples/python
25
Recursive search on directory tree
 Recursion base: files
 If it’s an mp3 file, we return its name
 Otherwise we don’t
 Recursion step: directories
 We call the function for each subdirectory and merge the
results
26
http://www.mediacollege.com/internet/images/tree.gif
Recursive search on directory tree
 Recursion base
def find_files(location, postfix=‘.mp3’):
if not isdir(location): # not a directory – a file
if location.endswith(postfix):
return [location]
else:
return [ ]
27
Recursive search on directory tree
 Recursion step
else:
results = []
for name in listdir(location):
new_path = join(location, name)
results += find_files(new_path, postfix)
return results
 We’ll now run the function on this computer
 Code: find_files.py
28
Exam Stuff
 Preparation class
 Yoav: Wed. 22.2, 13-15, Room 102 TOCHNA
 Noga: Thu. 23.2, 10-12, Room 020 Auditorium
 Send questions via email before 20.2
 We will go over the sample exam
 Exam material – everything from lectures, recitations, exercises
 You may bring a double sided A4 page, hand-written by yourself,
no photo-copying – write on it whatever you want
 This will be your very own Python reference in the future
29