Upgrade to Pro — share decks privately, control downloads, hide ads and more …

An Introduction to the Zen of Python

doughellmann
September 27, 2011

An Introduction to the Zen of Python

An introduction to the Python programming language organized around "The Zen of Python".

doughellmann

September 27, 2011
Tweet

More Decks by doughellmann

Other Decks in Programming

Transcript

  1. The Zen of Python by Tim Peters •Beautiful is better

    than ugly. •Explicit is better than implicit. •Simple is better than complex. •Complex is better than complicated. •Flat is better than nested. •Sparse is better than dense. •Readability counts. •Special cases aren't special enough to break the rules. •Although practicality beats purity. •Errors should never pass silently. •Unless explicitly silenced. •In the face of ambiguity, refuse the temptation to guess. •There should be one – and preferably only one – obvious way to do it. •Although that way may not be obvious at first unless you're Dutch. •Now is better than never. •Although never is often better than *right* now. •If the implementation is hard to explain, it's a bad idea. •If the implementation is easy to explain, it may be a good idea. •Namespaces are one honking great idea – let's do more of those! Friday, February 18, 2011
  2. Beautiful is better than ugly. • Write programs for human

    readers • Simple expression syntax • Consistent syntax and behavior Friday, February 18, 2011
  3. 1 i = 5 + 5 2 3 s =

    'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Simple Expressions Friday, February 18, 2011
  4. 1 i = 5 + 5 2 3 s =

    'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Simple Expressions Friday, February 18, 2011
  5. Simple Expressions 1 i = 5 + 5 2 3

    s = 'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Friday, February 18, 2011
  6. Simple Expressions 1 i = 5 + 5 2 3

    s = 'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Friday, February 18, 2011
  7. Simple Expressions 1 i = 5 + 5 2 3

    s = 'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Friday, February 18, 2011
  8. Simple Expressions 1 i = 5 + 5 2 3

    s = 'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Friday, February 18, 2011
  9. Simple Expressions 1 i = 5 + 5 2 3

    s = 'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Friday, February 18, 2011
  10. Simple Expressions 1 i = 5 + 5 2 3

    s = 'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Friday, February 18, 2011
  11. Simple Expressions 1 i = 5 + 5 2 3

    s = 'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Friday, February 18, 2011
  12. Simple Expressions 1 i = 5 + 5 2 3

    s = 'literal string' 4 5 m = """multi-line 6 string 7 """ 8 9 us = u'üñîçø∂é string' 10 11 vals = [ 1, 3, 5, 7, ] 12 vals[0] 13 14 t = ('a', 1, vals, None) 15 t[1] 16 17 d = { 'a':'a value', 18 'b':'b value', 19 } 20 d['a'] 21 22 if a or b: 23 do_something() 24 Friday, February 18, 2011
  13. Explicit is better than implicit. • Boolean type • No

    “hidden” loop variables • Use “self” to refer to object inside a method Friday, February 18, 2011
  14. Boolean Values 1 t = True 2 f = False

    3 4 if t: 5 print 't is true' 6 7 if not f: 8 print 'f is false' 9 10 a = t or f 11 b = t and f 12 13 print a 14 print b $ python booleans.py t is true f is false True False Friday, February 18, 2011
  15. for loops 1 print 'Numbers:' 2 3 for i in

    range(5): 4 print i 5 6 print 7 print 'Letters:' 8 9 for c in [ 'a', 'b', 'c' ]: 10 print c $ python for_loop.py Numbers: 0 1 2 3 4 Letters: a b c Friday, February 18, 2011
  16. Defining a Class 1 class MyClass(object): 2 """Class documentation. 3

    """ 4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  17. Defining a Class 1 class MyClass(object): 2 """Class documentation. 3

    """ 4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  18. Defining a Class 1 class MyClass(object): 2 """Class documentation. 3

    """ 4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  19. Defining a Class 1 class MyClass(object): 2 """Class documentation. 3

    """ 4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  20. Defining a Class 1 class MyClass(object): 2 """Class documentation. 3

    """ 4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  21. Simple is better than complex. • Garbage collection • print

    statement • Interactive interpreter for experimentation Friday, February 18, 2011
  22. Printing 1 # -*- encoding: utf-8 -*- 2 3 print

    'string:', 'string' 4 5 print 'unicode:', u'üñîçø∂é string' 6 7 print 'number:', 5 * 5 8 9 my_list = [ 1, 'a', None ] 10 print 'list:', my_list 11 12 my_dict = { 'a':'a value', 'b':'b value' } 13 print 'dict:', my_dict $ python printing.py string: string unicode: üñîçø∂é string number: 25 list: [1, 'a', None] dict: {'a': 'a value', 'b': 'b value'} Friday, February 18, 2011
  23. Printing, with printf-style Formatting 1 # -*- encoding: utf-8 -*-

    2 3 my_list = [ 1, 'a', None ] 4 my_dict = { 'a':'a value', 'b':'b value' } 5 6 args = ('string', u'üñîçø∂é string', 5 * 5, 7 my_list, my_dict) 8 9 print ''' 10 string : %s 11 unicode: %s 12 number : %d 13 list : %s 14 dict : %s 15 ''' % args $ python printing_with_format.py string : string unicode: üñîçø∂é string number : 25 list : [1, 'a', None] dict : {'a': 'a value', 'b': 'b value'} Friday, February 18, 2011
  24. Complex is better than complicated. • Do complex things in

    a “Pythonic” way • SciPy and NumPy for advanced science and math Friday, February 18, 2011
  25. NumPy Performance 1 a = range(10000000) 2 b = range(10000000)

    3 c = [] 4 for i in range(len(a)): 5 c.append(a[i] + b[i]) Standard Python 1 import numpy as np 2 a = np.arange(10000000) 3 b = np.arange(10000000) 4 c = a + b NumPy 5-10 seconds “nearly instantaneous” Friday, February 18, 2011
  26. Flat is better than nested. • Wide variety of modules

    in standard library • Namespace is flat • No need to use long names: com.company.java.blah.blah Friday, February 18, 2011
  27. Standard Library Modules: Networking • socket • select • SocketServer

    • BaseHTTPServer • asyncore • asynchat • xmlrpclib • SimpleXMLRPCServer Friday, February 18, 2011
  28. Standard Library Modules: Internet Protocols • urllib • httplib •

    ftplib • smtpd • smtplib • poplib • imaplib • json Friday, February 18, 2011
  29. Standard Library Modules: Command Line • getopt • optparse •

    argparse • fileinput • cmd • readline Friday, February 18, 2011
  30. Standard Library Modules: Parallel Processing • subprocess • threading •

    multiprocessing • Queue Friday, February 18, 2011
  31. Standard Library Modules: Miscellaneous • datetime • grp • pwd

    • profile • timeit • struct • ctypes • xml • tarfile • csv Friday, February 18, 2011
  32. Sparse is better than dense. • Standard library stays “shallow”

    • http://pypi.python.org/ • Allows separate release schedules • pip (“pip installs Python packages”) Friday, February 18, 2011
  33. Readability counts. • Whitespace for block structures • Minimal punctuation

    • Built-in documentation • Extensive online documentation at http://docs.python.org/ Friday, February 18, 2011
  34. 1 class MyClass(object): 2 """Class documentation. 3 """ 4 5

    def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Code Blocks Friday, February 18, 2011
  35. 1 class MyClass(object): 2 """Class documentation. 3 """ 4 5

    def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Code Blocks Friday, February 18, 2011
  36. Minimal Punctuation 1 class MyClass(object): 2 """Class documentation. 3 """

    4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  37. Minimal Punctuation 1 class MyClass(object): 2 """Class documentation. 3 """

    4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  38. Inline Documentation 1 class MyClass(object): 2 """Class documentation. 3 """

    4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  39. Inline Documentation 1 class MyClass(object): 2 """Class documentation. 3 """

    4 5 def __init__(self, arg1, arg2): 6 self.attr1 = arg1 7 self.attr2 = arg2 8 9 def do_something(self): 10 """Does some work and returns a value. 11 """ 12 return self.attr1 * self.attr2 13 14 obj = MyClass(1, 2) 15 print obj.do_something() Friday, February 18, 2011
  40. Special cases aren’t special enough to break the rules. •

    Everything is an object • Methods and functions differ by scope • Dynamic typing and runtime attribute lookup • Most “features” in external modules Friday, February 18, 2011
  41. String Methods 1 print ' string value '.split() 2 print

    ' string value '.strip() 3 print 'str' in ' string value ' 4 print 'CHUGALUG'.startswith('C') 5 print 'CHUGALUG'.endswith('end') 6 print ':'.join(['a', 'b', 'c']) $ python string_methods.py ['string', 'value'] string value True True False a:b:c Friday, February 18, 2011
  42. String Methods 1 print ' string value '.split() 2 print

    ' string value '.strip() 3 print 'str' in ' string value ' 4 print 'CHUGALUG'.startswith('C') 5 print 'CHUGALUG'.endswith('end') 6 print ':'.join(['a', 'b', 'c']) $ python string_methods.py ['string', 'value'] string value True True False a:b:c Friday, February 18, 2011
  43. String Methods 1 print ' string value '.split() 2 print

    ' string value '.strip() 3 print 'str' in ' string value ' 4 print 'CHUGALUG'.startswith('C') 5 print 'CHUGALUG'.endswith('end') 6 print ':'.join(['a', 'b', 'c']) $ python string_methods.py ['string', 'value'] string value True True False a:b:c Friday, February 18, 2011
  44. String Methods 1 print ' string value '.split() 2 print

    ' string value '.strip() 3 print 'str' in ' string value ' 4 print 'CHUGALUG'.startswith('C') 5 print 'CHUGALUG'.endswith('end') 6 print ':'.join(['a', 'b', 'c']) $ python string_methods.py ['string', 'value'] string value True True False a:b:c Friday, February 18, 2011
  45. String Methods 1 print ' string value '.split() 2 print

    ' string value '.strip() 3 print 'str' in ' string value ' 4 print 'CHUGALUG'.startswith('C') 5 print 'CHUGALUG'.endswith('end') 6 print ':'.join(['a', 'b', 'c']) $ python string_methods.py ['string', 'value'] string value True True False a:b:c Friday, February 18, 2011
  46. String Methods 1 print ' string value '.split() 2 print

    ' string value '.strip() 3 print 'str' in ' string value ' 4 print 'CHUGALUG'.startswith('C') 5 print 'CHUGALUG'.endswith('end') 6 print ':'.join(['a', 'b', 'c']) $ python string_methods.py ['string', 'value'] string value True True False a:b:c Friday, February 18, 2011
  47. String Methods 1 print ' string value '.split() 2 print

    ' string value '.strip() 3 print 'str' in ' string value ' 4 print 'CHUGALUG'.startswith('C') 5 print 'CHUGALUG'.endswith('end') 6 print ':'.join(['a', 'b', 'c']) $ python string_methods.py ['string', 'value'] string value True True False a:b:c Friday, February 18, 2011
  48. Function and Method Scope 1 class MyClass(object): 2 3 def

    do_something(self, arg1, arg2): 4 return arg1 * arg2 5 6 def my_function(arg1, arg2): 7 return arg1 * arg2 Friday, February 18, 2011
  49. Dynamic Attribute Lookup 1 class MyClass(object): 2 3 CLASS_ATTR =

    'class value' 4 5 def __init__(self, arg): 6 self.attr = arg 7 8 o = MyClass('instance value') 9 print o.attr 10 print o.CLASS_ATTR $ python dynamic_attribute_lookup.py instance value class value Friday, February 18, 2011
  50. Dynamic Typing 1 class A(object): 2 def do_something(self): 3 print

    'in A' 4 5 class B(object): 6 def do_something(self): 7 print 'in B' 8 9 def work_on_obj(c): 10 c.do_something() 11 12 a = A() 13 b = B() 14 15 work_on_obj(a) 16 work_on_obj(b) $ python dynamic_typing.py in A in B Friday, February 18, 2011
  51. Regular Expressions 1 import re 2 3 pattern = 'this'

    4 text = 'Does this text match the pattern?' 5 6 match = re.search(pattern, text) 7 8 s = match.start() 9 e = match.end() 10 11 print 'Found :', match.re.pattern 12 print 'In :', match.string 13 print 'Range :', s, '-', e 14 print 'Substring:', text[s:e] $ python using_regex.py Found : this In : Does this text match the pattern? Range : 5 - 9 Substring: this Friday, February 18, 2011
  52. Although practicality beats purity. • Multiple Programming Models • OOP

    • Procedural • Functional Friday, February 18, 2011
  53. Procedural 1 def my_function(arg1, arg2): 2 """This function multiplies arg1

    by arg2. 3 """ 4 return arg1 * arg2 5 6 results = [] 7 for i in range(5): 8 results.append(my_function(i, i)) 9 10 print results $ python procedural.py [0, 1, 4, 9, 16] Friday, February 18, 2011
  54. Functional: List Comprehension 1 results = [ i*i for i

    in range(5) ] 2 3 print results $ python functional.py [0, 1, 4, 9, 16] Friday, February 18, 2011
  55. Functional: List Comprehension 1 results = [ i*i for i

    in range(5) ] 2 3 print results $ python functional.py [0, 1, 4, 9, 16] Friday, February 18, 2011
  56. Functional: List Comprehension 1 results = [ i*i for i

    in range(5) ] 2 3 print results $ python functional.py [0, 1, 4, 9, 16] Friday, February 18, 2011
  57. Functional: List Comprehension 1 results = [ i*i for i

    in range(5) ] 2 3 print results $ python functional.py [0, 1, 4, 9, 16] Friday, February 18, 2011
  58. Functional: Generator Expression 1 results = ( i*i for i

    in range(5) ) 2 3 print results 4 5 for i in results: 6 print i 1 $ python generator_expr.py 2 <generator object <genexpr> at 0x1004d20a0> 3 0 4 1 5 4 6 9 7 16 Friday, February 18, 2011
  59. Functional: Generators 1 def gen_values(n): 2 for i in range(n):

    3 yield i*i 4 5 print gen_values(5) 6 7 for i in gen_values(5): 8 print i 1 $ python generator.py 2 <generator object gen_values at 0x1004d2050> 3 0 4 1 5 4 6 9 7 16 Friday, February 18, 2011
  60. Errors should never pass silently. • Exception-based error handling •

    Tracebacks aid debugging Friday, February 18, 2011
  61. Exceptions and Tracebacks 1 def f(n): 2 if n >

    0: 3 return n * f(n-1) 4 return 1 5 6 print f('5') $ python traceback.py Traceback (most recent call last): File ".../traceback.py", line 6, in <module> print f('5') File ".../traceback.py", line 3, in f return n * f(n-1) TypeError: unsupported operand type(s) for -: 'str' and 'int' Friday, February 18, 2011
  62. Raising Exceptions 1 def f(n): 2 if not isinstance(n, int):

    3 raise TypeError('n should be an int') 4 if n > 0: 5 return n * f(n-1) 6 return 1 7 8 print f('5') $ python raising.py Traceback (most recent call last): File ".../raising.py", line 8, in <module> print f('5') File ".../raising.py", line 3, in f raise TypeError('n should be an int') TypeError: n should be an int Friday, February 18, 2011
  63. Raising Exceptions 1 def f(n): 2 if not isinstance(n, int):

    3 raise TypeError('n should be an int') 4 if n > 0: 5 return n * f(n-1) 6 return 1 7 8 print f('5') $ python raising.py Traceback (most recent call last): File ".../raising.py", line 8, in <module> print f('5') File ".../raising.py", line 3, in f raise TypeError('n should be an int') TypeError: n should be an int Friday, February 18, 2011
  64. Unless explicitly silenced. • Catch exceptions with try:except • Process

    • Convert • Ignore Friday, February 18, 2011
  65. Catching Exceptions 1 def f(n): 2 if not isinstance(n, int):

    3 raise TypeError('n should be an int') 4 if n > 0: 5 return n * f(n-1) 6 return 1 7 8 try: 9 print f('5') 10 except TypeError, err: 11 print 'Had an error:', err 12 else: 13 print 'No error' 14 finally: 15 print 'Always run' $ python catching.py Had an error: n should be an int Always run Friday, February 18, 2011
  66. In the face of ambiguity, refuse the temptation to guess.

    • Coerce types only when not surprising • Cannot add strings and numbers • Can multiply them! Friday, February 18, 2011
  67. Type Coercion 1 print 5 * 1.0 2 print 2

    ** 100 3 print 2 * 'abc' 4 print 2 + 'abc' 1 $ python type_coercion.py 2 5.0 3 1267650600228229401496703205376 4 abcabc 5 Traceback (most recent call last): 6 File ".../type_coercion.py", line 4, in <module> 7 print 2 + 'abc' 8 TypeError: unsupported operand type(s) for +: 'int' and 'str' Friday, February 18, 2011
  68. Type Coercion 1 print 5 * 1.0 2 print 2

    ** 100 3 print 2 * 'abc' 4 print 2 + 'abc' 1 $ python type_coercion.py 2 5.0 3 1267650600228229401496703205376 4 abcabc 5 Traceback (most recent call last): 6 File ".../type_coercion.py", line 4, in <module> 7 print 2 + 'abc' 8 TypeError: unsupported operand type(s) for +: 'int' and 'str' Friday, February 18, 2011
  69. Type Coercion 1 print 5 * 1.0 2 print 2

    ** 100 3 print 2 * 'abc' 4 print 2 + 'abc' 1 $ python type_coercion.py 2 5.0 3 1267650600228229401496703205376 4 abcabc 5 Traceback (most recent call last): 6 File ".../type_coercion.py", line 4, in <module> 7 print 2 + 'abc' 8 TypeError: unsupported operand type(s) for +: 'int' and 'str' Friday, February 18, 2011
  70. Type Coercion 1 print 5 * 1.0 2 print 2

    ** 100 3 print 2 * 'abc' 4 print 2 + 'abc' 1 $ python type_coercion.py 2 5.0 3 1267650600228229401496703205376 4 abcabc 5 Traceback (most recent call last): 6 File ".../type_coercion.py", line 4, in <module> 7 print 2 + 'abc' 8 TypeError: unsupported operand type(s) for +: 'int' and 'str' Friday, February 18, 2011
  71. Type Coercion 1 print 5 * 1.0 2 print 2

    ** 100 3 print 2 * 'abc' 4 print 2 + 'abc' 1 $ python type_coercion.py 2 5.0 3 1267650600228229401496703205376 4 abcabc 5 Traceback (most recent call last): 6 File ".../type_coercion.py", line 4, in <module> 7 print 2 + 'abc' 8 TypeError: unsupported operand type(s) for +: 'int' and 'str' Friday, February 18, 2011
  72. There should be one – and preferably only one –

    way to do it. • Eliminate redundancy • Easier to learn • Easier to remember Friday, February 18, 2011
  73. Index API 1 a = [ 1, 2, 3 ]

    2 print a[0] 3 4 a = (1, 2, 3) 5 print a[0] 6 7 a = 'abc' 8 print a[0] 9 10 a = {0:'zero value', 11 1:'one value', 12 } 13 print a[0] $ python index_api.py 1 1 a zero value Friday, February 18, 2011
  74. Although that way may not be obvious at first unless

    you’re Dutch. • GUI • GTK • KDE • Cocoa • MS Windows • Tk • wxPython • Web • Django • AppEngine • Pyramid • Flask • TurboGears • Pecan Friday, February 18, 2011
  75. Now is better than never. • ctypes • Jython •

    IronPython • Python 2 vs. Python 3 Friday, February 18, 2011
  76. Although never is often better than right now. • Language

    moratorium • Not everything goes into stdlib any more Friday, February 18, 2011
  77. If the implementation is hard to explain, it’s a bad

    idea. Python Enhancement Proposals Friday, February 18, 2011
  78. If the implementation is easy to explain, it may be

    a good idea. Friday, February 18, 2011
  79. Namespaces are one honking great idea – let’s do more

    of those! Closures Friday, February 18, 2011
  80. Closures 1 def outer(arg): 2 print 'outer(%s)' % arg 3

    4 def inner(val): 5 print 'inner(%s) (arg=%s)' % (val, arg) 6 return val * arg 7 8 return inner 9 10 print 'Creating thrice:' 11 thrice = outer(3) 12 13 print '\nCalling thrice:' 14 print thrice(3) 15 print thrice('a') Friday, February 18, 2011
  81. Closures 1 def outer(arg): 2 print 'outer(%s)' % arg 3

    4 def inner(val): 5 print 'inner(%s) (arg=%s)' % (val, arg) 6 return val * arg 7 8 return inner 9 10 print 'Creating thrice:' 11 thrice = outer(3) 12 13 print '\nCalling thrice:' 14 print thrice(3) 15 print thrice('a') $ python closure.py Creating thrice: outer(3) Calling thrice: inner(3) (arg=3) 9 inner(a) (arg=3) aaa Friday, February 18, 2011
  82. References • http://docs.python.org/ • http://www.doughellmann.com/ PyMOTW/ • Learning Python by

    Mark Lutz • Python Essential Reference by David Beazley • The Python Standard Library by Example by Doug Hellmann • http://us.pycon.org/ Friday, February 18, 2011
  83. Image Credits 1. http://www.gaialandscapedesignbackgrounds.net/landscape_design_architecture_background_Zen_Garden_chan3.htm 3. http://www.flickr.com/photos/grabadonut/539151245/sizes/l/in/photostream/ 13. http://www.flickr.com/photos/tobascodagama/3106398602/ 17. http://www.flickr.com/photos/benandliz/11065336/

    21 & 22. http://scipy.org 24. http://www.otherlandtoys.co.uk/russian-matryoshka-nesting-dolls-pieces-p-2126.html 32. http://www.dandelionsummers.com/html/building_block.html 36. http://www.flickr.com/photos/photoinference/2494576240/in/faves-40068198@N04/ 47. http://www.flickr.com/photos/smithsonian/3112472619/in/faves-40068198@N04/ 54. http://www.flickr.com/photos/mherring/3722272868/sizes/l/in/photostream/ 57. http://www.webstaurantstore.com/9-3-4-x-4-1-2-unbleached-natural-coffee-filter-12-cup-1000-cs/121CF12U.html 59. http://brainstorm-services.com/wcu-lit/ambiguity.html 66. http://commons.wikimedia.org/wiki/File:Dutch_windmill.jpg 67. http://www.epicpm.org/epic-blogging 68. http://www.skyscanner.net/news/articles/2009/09/002990-travel-tip-10-get-on-last-and-learn-the-art-of-patience.html 69. http://gizmodo.com/5015735/the-top-10-rube-goldberg-machines-featured-on-film 71. http://www.nutricaplabs.com/capsule-manufacturer.aspx 75. http://wmltech.wordpress.com/2006/12/09/got-questions/ Friday, February 18, 2011