Mosky: ● The examples and the PDF version are available at: – j.mp/mosky-programming-with-python. ● It is welcome to give me any advice of this slide or ask me the answers of the challenges. – mosky.tw 2
Topics ● Basic Topics ● Adv. Topics – Python 2 or 3? – Module and Package – Environment – Typing – hello.py – Comprehension – Common Types – Functional Technique – Flow Control – Object-oriented Prog. – File I/O – Useful Libraries – Documentation ● Final Project – Scope – A Blog System 5
6.
An Investigation Do youknow _________ ? – any other programming language – Object-oriented – Static Typing; Strong and Weak Typing – Dynamic Typing – Functor; Closure – Functional Programming – Web development 6
Python 2 or3? ● Python 2.x ● Python 3.x – status quo – present & future – 2.7 is end-of-life release – under active development – harder for newcomers – easier for newcomers – more third-party lib. – less third-party lib. – 2to3.py – 3to2.py – backported features: – new features: ● What's News in Python 2.6 ● What's News in Python 3.0 docs.python.org/release/2.6.4/whatsnew/2.6.html docs.python.org/py3k/whatsnew/3.0.html ● What's News in Python 2.7 docs.python.org/dev/whatsnew/2.7.html 8
9.
Python 2 or3? (cont.) ● Use Python 3 if you can. ● Decide Python 2 or 3 by the libraries you will use. ● Today, we will go ahead with Python 2. And introduce you to the changes in Python3. 9
On Linux orMac ● Python is built-in on Linux or Mac. ● All you have to do is check the version. Type "python" in any terminal. Python 2.7.3 (default, Sep 26 2012, 21:51:14) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 11
12.
On Windows ● Download the installer from: "http://python.org/download" ● Install it. ● Add the Python's PATH. – Computer → System Properties → Advanced system settings → Advanced tab → Environment Variables → System Variables → find PATH. – "...;C:Python27" 12
13.
Editor / IDE ● The Editors ● The IDE – Sublime Text 2 – IDLE www.sublimetext.com ● Debian-base: – VIM sudo apt-get install idle wiki.python.org/moin/Vim ● Windows: – Gnome Text Editor Use the Start Menu to (gedit) search "IDLE" – Notepad++ ● The others: notepad-plus-plus.org – wiki.python.org/moin/PythonEditors – ... 13
14.
The Python Shell ● Type "python" in terminal. – >>> – ... ● Leaving a shell: – exit() – Linux or Mac: Ctrl+D – Windows: Ctrl+Z<Enter> 14
15.
The python Command ● Enter Python shell without arguments. ● python hello.py ● python -c 'print "Hello, World!"' ● python -m SimpleHTTPServer 15
hello.py #!/usr/bin/env python ● #! the shebang. # -*- coding: utf-8 -*- ● # -*- defines the encoding # file: hello.py of this file. ● # means the comments. def hello(name=None): if name:n ● : starts a block. return 'Hello, %s!' % name else: ● A block uses 4-space indent. return 'Hello, Python!' ● A statement ends with n. 17
18.
hello.py (cont.) if __name__== '__main__': ● __name__, the name of module. import sys if len(sys.argv) >= 2: ● import is important. print The usage: hello(sys.argv[1]) else: ● import sys print hello() ● from sys import argv ● … as alias 18
The print Statement print 'End with a new line char.' print 'Print', 'multiple', 'strings.' print 'End with a space.', print # print a new line char 20
21.
The print functionin Python 3 print('End with a new line char.') print('Print', 'multiple', 'strings.') print('End with a space.', end=' ') print() # print a new line char print('End with a space.', end='') print('a', 'b', 'c', seq=',') 21
List and Tuple List(mutable seq.) Tuple (seq.) – [] – tuple() – ['item'] – ('item', ) – ['s', 100, u'unicode'] – ('s', 100, u'unicode') – list('abc') – tuple('abc') – 'a b c'.split(' ') – 'n'.join(['spam', – 'n'.join(('spam', 'eggs']) 'eggs')) – x, y = [1, 2] – x, y = (1, 2) – x, y = [y, x] – x, y = (y, x) 37
38.
Sequence Sequence Mutable Seq. – s[i] = x – x in s # performance? – s[i:j] = t – x not in s – del s[i:j] – s + t – s[i:j:k] = t – s * n, n * s – s.append(x) – s.insert(i, x) – s[i] – s.pop([i]) – s[i:j] – s.remove(x) # performance? – s[i:j:k] – s.extend(t) in-place – len(s) – s.sort([cmp[, key[, reverse]]]) – s.index(x) – s.sort([key[, reverse]]) # Py 3 – s.count(x) – s.reverse() 38
Sequence (cont.) Slicing andSlice object: – s = range(10) – s = 'I am a str.' – t = s – s[:-3] – t[0] = 'A' – print s – s.reverse() – t is s → TypeError – s[::-1] – t = s[:] – ''.join(reversed(s)) – t is s – slice(None, None, -1) 41
42.
Mapping Dict. (mutable map.) – len(d) – {} – d[k] – {'A ': 1, 'B': 2, 'C': 3} – d[k] = v – dict({...}) – del d[k] – dict(A=1, B=2, C=3) – k in d, k not in d – d.copy() – d.get(key[, default]) – k = 'ABC' – d.setdefault(key[, default]) – v = [1, 2, 3] – d.items(), d.keys(), d.values() – pairs = zip(k, v) – d.pop(key[, default) – dict(pairs) – d.update([other]) ... 42
43.
Set Set (mutable set) – len(s) – set() – x in s, x not in s – {'A', 'B', 'C'} # Py3 – s.copy() – s.add(elem) – set('ABC') – s.discard(elem) – set(['A','B','C']) – s.pop() – s |= other – s &= other – s | other | ... – s & other & ... – s < | <= | == | > = | > other ... 43
The if Statement if[condition 1]: … elif [condition 2]: … elif [condition 3]: … else: … [exp. if true] if [condition] else [exp. if false] 45
46.
Truth Value Testing Theyare same as False in a boolean context: – None – False – Zeros (ex. 0, 0.0, 0L, 0j) – Empty containers (ex. '', [], {}) – __nonzero__() or __len__() returns 0 or False 46
47.
Truth Value Testing(cont.) ● if not None: ... ● if not []: ... ● if [0]: ... ● if [[]]: ... ● if "": ... ● if {}: ... ● if not {0: False}: … … 47
48.
The for Statement for[item] in [iterable]: for i in [0, 1, 2]: … print i for i in range(3): for i in xrange(3): print i print i 48
49.
The for Statementin Python 3 for [item] in [iterable]: for i in [0, 1, 2]: … print i for i in range(3): for i in xrange(3): print i print i 49
50.
The for Statement(cont.) for i in range(1, 3): for i in range(3, -1, -1): print i print i s = [1, 2, 3] s = [...] t = 'xyz' for i, item in enumerate(s): print i, item for i, j in zip(s, t): print i, j 50
51.
The for Statement(cont.) ● It is like for … each in other language. – Note: Python hasn't other for loop. ● It can iterate all of iterable object. – In other words, the object which defined __iter__. – ex. sequence, mapping, set, ... 51
52.
Challenge 1: APyramid ● Use for loop to build a * pyramid on right. *** – without limit. ***** – limit: in two lines ******* ● hint: string formatting 52
53.
Challenge 2-1: Countthe Chars ● Use for loop to count "Please count the the sentence on right. characters here." – without limit. – limit: without if ● hint: use get {'P': 1, ...} 53
54.
Challenge 2-2: Collectthe Chars ● Use for loop to collect "Here are UPPERCASE the chars. and lowercase chars." – limit: use setdefault {'c': ['C', 'c', 'c'], ...} 54
55.
The while Statement tasks= [...] while tasks: while 1: … … ● It leaves the loop once ● A infinite loop. the tasks is empty. ● It is better to use block mechanism in a loop. – ex. I/O block 55
56.
The break, continueStatement loop …: loop …: if …: break if …: continue ● It terminates a loop. ● It continues with the next iteration. 56
57.
The break, continueStatement (cont.) ● They do the same thing in both C and Python. ● Using break or continue is encouraged. – take the place of the complicated condition in a while. – faster, because Python is interpreted. ● Just use them. 57
The else Clauseon Loops loop …: … else: … ● No a clause on the if statement! ● If the loop isn't broken by any break statement, the else block is executed. ● It replaces the flags we usually used. 59
60.
Challenge 3-1: ThePrimes ● Try to filter the primes [2, 3, 5, 7, 11, 13, from [2, 100). 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, – without limit. 59, 61, 67, 71, 73, – limit: use loop's else 79, 83, 89, 97] 60
The try Statementin Python 3 try: … except LookupError as e: … except (IndexError, KeyError) as e: … else: … finally: … 62
63.
The try Statement(cont.) ● For avoiding to catch the exception we don't expect, you should: – reduce your code in try block. ● move them to else block. – make the exception precise in except statement. ● Avoid using Exception. ● ref: docs.python.org/2/library/exceptions.html#exception-hierarchy ● Release the resource in finally block. – or use context manager – ex. file, socket, … ● raise SomeError 63
The def Statement(cont.) def f(): pass def g(): pass d = {'x': f, 'y': g} d['x']() ● Python functions are first-class functions. – It means you can pass functions as arguments, and assign functions to variables. – It is like the function pointers in C. 69
70.
An Example ofUsing while, try and def. # file: ex_try.py $ python ex_try.py def take_int(prompt='Give me a int: '): Give me a int: str while 1: try: It is not a int! user_input = int(raw_input(prompt)) Give me a int: abc except ValueError, e: print 'It is not a int!' It is not a int! else: return user_input Give me a int: 100 if __name__ == '__main__': I got a int from user: x = take_int() 100 print 'I got a int from user: %d' % x $ 70
71.
A Trap ofthe Default Value # file: ex_defval_trap.py ● Because the list is created when the def f(items=[]): function is defined. items.append(1) return items ● Avoid to use the mutable types as the if __name__ == '__main__': default value. print f() # -> [1] print f() # -> [1, 1] print f() # -> [1, 1, 1] 71
72.
Challenge 4: ABMI Calculator ● BMI: Body Mass Index Enter your height (M): – BMI = weight (KG) ÷ height (M)2 1.63 – < 18.5 → Underweight Enter your weight (KG): – [18.5, 25) → Normal weight – [25, 30) → Overweight 49 – >= 30 → Obesity --- ● Write a BMI calculator. Your BMI is: – without limit. – limit: only one if 18.44 (Underweight) ● hint: use loop Ideal weight is between: 49.15 ~ 66.42 72
The file Object f= open('input.txt') f = print f.read() open('output.txt', 'w') f.seek(0) f.write('a line.n') for line in f: f.close() print line, f.close() 74
75.
The Context Manager with open('input.txt') as f: for line in f: print line, f.close() ● Python 2.5↑ – Python 2.5.x: from __future__ import with_statement – Python 2.6↑: It is mandatory. 75
76.
Challenge 2: Countthe Chars (cont.) – limit 3: with the files The path of input: input.txt The path of output: output.txt --- The result was written. 76
77.
The csv Moudle #!/usr/bin/envpython 1, apple # -*- coding: utf-8 -*- 2, orange # file: ex_csv.py 3, watermelon import csv ['1', ' apple'] with open('ex_csv.csv') as f: ['2', ' orange'] for row in csv.reader(f): print row ['3', ' watermelon'] 77
78.
The os.path Moudle #file: ex_os_path.py $ python ex_os_path.py from os import walk from os.path import join It requires a path as def list_files(path): paths = [] argument. for root, dir_names, file_names in walk(path): for file_name in file_names: paths.append(join(root, file_name)) $ python ex_os_path.py . return paths …/1 if __name__ == '__main__': import sys …/b/4 from os.path import abspath, dirname if len(sys.argv) == 2: …/a/2 path = abspath(dirname(sys.argv[1])) for path in list_files(path): …/a/3 print path else: print 'It requires a path as argument.' 78
The help Function ● In Python shell: ● In terminal: – help(open) – $ pydoc SimpleHTTPServer – dir(open) – $ pydoc csv – $ pydoc os.path – 'n'.join(dir(open)) 80
81.
Your Documentation $ pydoc ex_doc # file: ex_doc.py Help on module ex_doc: '''module-level doc.''' NAME ex_doc - module-level doc. def f(x): FILE '''A short sentence describes this function. /home/mosky/programming-with-python/ex_doc.py FUNCTIONS About the parameters, return f(x) value or any other detail ... A short sentence describes this ''' function. pass About the parameters, return value or any other detail ... 81
Scope # file: ex_scope.py $ python ex_scope.py global x = 'global' local def f(): $ if 1: x = 'local' return x ● Scopes are decided by functions. if __name__ == '__main__': print x print f() 83
84.
The LEGB Rule #file: ex_LEGB.py ● return … global_var = 100 – Local (in function) def f(): enclosed_var = 10 – Enclosed def g(): – Global local_var = 1 return sum([local_var, enclosed_var, – Built-in global_var]) return g() if __name__ == '__main__': print f() # -> 111 84
Challenge 5: MixAll ● You have many $ python mix.py pyramid 10 functions now. … $ python mix.py primes 100 Try to write a CLI … program to trigger your $ python mix.py bmi 1.63 49 functions. … – without limit $ python mix.py blah blah – limit: without if. Please check your args. 86