90 likes | 277 Views
CSC1018F: Functional Programming. Diving into Python Ch. 16. Lecture Outline. Recap of Regular Expressions [week 3] Functional Programming The Zen of Functional Programming Finding Path Names Filtering and Mapping Revisited Revision Exercise: Chess Notation. Recap of Regular Expressions.
E N D
CSC1018F:Functional Programming Diving into Python Ch. 16
Lecture Outline • Recap of Regular Expressions [week 3] • Functional Programming • The Zen of Functional Programming • Finding Path Names • Filtering and Mapping Revisited • Revision Exercise: Chess Notation
Recap of Regular Expressions • A powerful mechanism for identifying patterns in text • But need to be handled with care • An entirely new syntax is required • Verbose regular expressions include whitespace and comments • The verbose form is preferred
Introduction to Functional Programming • Data-centric thought pattern • Functions are simply treated as another form of data • Can be operated on and passed as arguments! • Enables higher level logic and avoid “busywork coding” • A philosophy of focusing on the data and how it needs to be transformed
Finding Path Names • Functions useful in finding the name and path of the currently executing script: • sys.argv - a list with the name and command line arguments of the script • os.path.dirname(filename) - separates out and returns the path portion of filename • os.path.abspath(pathname) - expands a pathname from partial to full. Performs normalization • os.getcwd() - returns the current working directory
Filtering Lists Differently • Pass a function and a list to a filter. List elements are passed to the function which returns True for elements in the final filtered list • Syntax: filter(fn, li) • fn takes a single argument and evaluates to true or false • Example: >>> def odd(n): ... return n % 2 ... >>> li = range(10) >>> filter(odd, li) [1,3,5,7,9] >>> [e for e in li if odd(e)]
Mapping Lists Differently • Pass a function and a list to a map. List elements are passed through the function: • Syntax: map(fn, li) • fn takes a single argument, operates on it and returns a new version • Example: >>> def double(n): ... return n * 2 ... >>> li = range(10) >>> map(double, li) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> [double(e) for e in li]
Example: Dynamically Importing Modules • __import__ - a built in function that takes a module name as a string and returns the module • Allows us to load and access modules that are only named at run-time • Example: >>> moduleNames = [‘sys’, ‘os’, ‘re’] >>> modules = map(__import__, moduleNames) >>> modules [<module 'sys' (built-in)>, <module 'os' from '/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/os.pyc'>, <module 're' from '/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/re.pyc'>] >>> modules[0].version '2.3.3 (#2, Dec 23 2003, 22:56:29) \n[GCC 3.1 20020420 (prerelease)]'
Revision Exercise • You are tasked with coding an “anonymization” program. This replaces names with initials in order to hide identity: • To begin, read in a list of names from a file “idprotect.txt”, which contains names in the form: “Firstname” and also “Firstname Surname” on separate lines • The main text should be read in from “plaintext.txt” and all occurrences of idprotect names replaced with their corresponding initial. Thus “John” becomes “J.” and “John Smith” becomes “J. S.” The final anonymous text should be output to the file “anontext.txt” • Do this using regular expressions, maps and filters, where appropriate