Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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