An Introduction to the Zen of Python

88
An Introduction to the Zen of Python Doug Hellmann February, 2011 Friday, February 18, 2011

description

An introduction to the Python programming language.

Transcript of An Introduction to the Zen of Python

Page 1: An Introduction to the Zen of Python

An Introduction tothe Zen of Python

Doug Hellmann February, 2011

Friday, February 18, 2011

Page 2: An Introduction to the Zen of Python

The Zen of Pythonby 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

Page 3: An Introduction to the Zen of Python

Beautiful is better than ugly.

• Write programs for human readers

• Simple expression syntax

• Consistent syntax and behavior

Friday, February 18, 2011

Page 4: An Introduction to the Zen of Python

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

Page 5: An Introduction to the Zen of Python

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

Page 6: An Introduction to the Zen of Python

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

Page 7: An Introduction to the Zen of Python

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

Page 8: An Introduction to the Zen of Python

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

Page 9: An Introduction to the Zen of Python

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

Page 10: An Introduction to the Zen of Python

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

Page 11: An Introduction to the Zen of Python

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

Page 12: An Introduction to the Zen of Python

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

Page 13: An Introduction to the Zen of Python

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

Page 14: An Introduction to the Zen of Python

Explicit is better than implicit.

• Boolean type

• No “hidden” loop variables

• Use “self” to refer to object inside a method

Friday, February 18, 2011

Page 15: An Introduction to the Zen of Python

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.pyt is truef is falseTrueFalse

Friday, February 18, 2011

Page 16: An Introduction to the Zen of Python

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:01234

Letters:abc

Friday, February 18, 2011

Page 17: An Introduction to the Zen of Python

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

Page 18: An Introduction to the Zen of Python

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

Page 19: An Introduction to the Zen of Python

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

Page 20: An Introduction to the Zen of Python

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

Page 21: An Introduction to the Zen of Python

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

Page 22: An Introduction to the Zen of Python

Simple is better than complex.

• Garbage collection

• print statement

• Interactive interpreter for experimentation

Friday, February 18, 2011

Page 23: An Introduction to the Zen of Python

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: stringunicode: üñîçø∂é stringnumber: 25list: [1, 'a', None]dict: {'a': 'a value', 'b': 'b value'}

Friday, February 18, 2011

Page 24: An Introduction to the Zen of Python

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 : stringunicode: üñîçø∂é stringnumber : 25list : [1, 'a', None]dict : {'a': 'a value', 'b': 'b value'}

Friday, February 18, 2011

Page 25: An Introduction to the Zen of Python

Interactive Interpreter

Friday, February 18, 2011

Page 26: An Introduction to the Zen of Python

Complex is better than complicated.

• Do complex things in a “Pythonic” way

• SciPy and NumPy for advanced science and math

Friday, February 18, 2011

Page 27: An Introduction to the Zen of Python

Interactive Graphic Environment

SciPy, NumPy, matplotlib

Friday, February 18, 2011

Page 28: An Introduction to the Zen of Python

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

Page 29: An Introduction to the Zen of Python

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

Page 30: An Introduction to the Zen of Python

Standard Library Modules: Networking

• socket

• select

• SocketServer

• BaseHTTPServer

• asyncore

• asynchat

• xmlrpclib

• SimpleXMLRPCServer

Friday, February 18, 2011

Page 31: An Introduction to the Zen of Python

Standard Library Modules: Internet Protocols

• urllib

• httplib

• ftplib

• smtpd

• smtplib

• poplib

• imaplib

• json

Friday, February 18, 2011

Page 32: An Introduction to the Zen of Python

Standard Library Modules: Command Line

• getopt

• optparse

• argparse

• fileinput

• cmd

• readline

Friday, February 18, 2011

Page 33: An Introduction to the Zen of Python

Standard Library Modules: Parallel Processing

• subprocess

• threading

• multiprocessing

• Queue

Friday, February 18, 2011

Page 34: An Introduction to the Zen of Python

Standard Library Modules: Databases

• anydbm

• pickle

• shelve

• sqlite3

Friday, February 18, 2011

Page 35: An Introduction to the Zen of Python

Standard Library Modules: Miscellaneous

• datetime

• grp

• pwd

• profile

• timeit

• struct

• ctypes

• xml

• tarfile

• csv

Friday, February 18, 2011

Page 36: An Introduction to the Zen of Python

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

Page 37: An Introduction to the Zen of Python

Readability counts.

• Whitespace for block structures

• Minimal punctuation

• Built-in documentation

• Extensive online documentation at http://docs.python.org/

Friday, February 18, 2011

Page 38: An Introduction to the Zen of Python

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

Page 39: An Introduction to the Zen of Python

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

Page 40: An Introduction to the Zen of Python

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

Page 41: An Introduction to the Zen of Python

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

Page 42: An Introduction to the Zen of Python

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

Page 43: An Introduction to the Zen of Python

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

Page 44: An Introduction to the Zen of Python

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

Page 45: An Introduction to the Zen of Python

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 valueTrueTrueFalsea:b:c

Friday, February 18, 2011

Page 46: An Introduction to the Zen of Python

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 valueTrueTrueFalsea:b:c

Friday, February 18, 2011

Page 47: An Introduction to the Zen of Python

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 valueTrueTrueFalsea:b:c

Friday, February 18, 2011

Page 48: An Introduction to the Zen of Python

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 valueTrueTrueFalsea:b:c

Friday, February 18, 2011

Page 49: An Introduction to the Zen of Python

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 valueTrueTrueFalsea:b:c

Friday, February 18, 2011

Page 50: An Introduction to the Zen of Python

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 valueTrueTrueFalsea:b:c

Friday, February 18, 2011

Page 51: An Introduction to the Zen of Python

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 valueTrueTrueFalsea:b:c

Friday, February 18, 2011

Page 52: An Introduction to the Zen of Python

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

Page 53: An Introduction to the Zen of Python

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.pyinstance valueclass value

Friday, February 18, 2011

Page 54: An Introduction to the Zen of Python

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.pyin Ain B

Friday, February 18, 2011

Page 55: An Introduction to the Zen of Python

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.pyFound : thisIn : Does this text match the pattern?Range : 5 - 9Substring: this

Friday, February 18, 2011

Page 56: An Introduction to the Zen of Python

Although practicality beats purity.

• Multiple Programming Models

• OOP

• Procedural

• Functional

Friday, February 18, 2011

Page 57: An Introduction to the Zen of Python

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

Page 58: An Introduction to the Zen of Python

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

Page 59: An Introduction to the Zen of Python

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

Page 60: An Introduction to the Zen of Python

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

Page 61: An Introduction to the Zen of Python

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

Page 62: An Introduction to the Zen of Python

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

Page 63: An Introduction to the Zen of Python

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

Page 64: An Introduction to the Zen of Python

Errors should never pass silently.

• Exception-based error handling

• Tracebacks aid debugging

Friday, February 18, 2011

Page 65: An Introduction to the Zen of Python

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.pyTraceback (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

Page 66: An Introduction to the Zen of Python

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.pyTraceback (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

Page 67: An Introduction to the Zen of Python

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.pyTraceback (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

Page 68: An Introduction to the Zen of Python

Unless explicitly silenced.

• Catch exceptions with try:except

• Process

• Convert

• Ignore

Friday, February 18, 2011

Page 69: An Introduction to the Zen of Python

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.pyHad an error: n should be an intAlways run

Friday, February 18, 2011

Page 70: An Introduction to the Zen of Python

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

Page 71: An Introduction to the Zen of Python

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

Page 72: An Introduction to the Zen of Python

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

Page 73: An Introduction to the Zen of Python

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

Page 74: An Introduction to the Zen of Python

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

Page 75: An Introduction to the Zen of Python

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

Page 76: An Introduction to the Zen of Python

There should be one – and preferably only one – way to do it.

• Eliminate redundancy

• Easier to learn

• Easier to remember

Friday, February 18, 2011

Page 77: An Introduction to the Zen of Python

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.py11azero value

Friday, February 18, 2011

Page 78: An Introduction to the Zen of Python

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

Page 79: An Introduction to the Zen of Python

Now is better than never.

• ctypes

• Jython

• IronPython

• Python 2 vs. Python 3

Friday, February 18, 2011

Page 80: An Introduction to the Zen of Python

Although never is often better than right now.

• Language moratorium

• Not everything goes into stdlib any more

Friday, February 18, 2011

Page 81: An Introduction to the Zen of Python

If the implementation is hard to explain, it’s a bad idea. Python Enhancement Proposals

Friday, February 18, 2011

Page 82: An Introduction to the Zen of Python

If the implementation is easy to explain, it may be a good idea.

Friday, February 18, 2011

Page 83: An Introduction to the Zen of Python

Namespaces are one honking great idea – let’s do more of those!

Closures

Friday, February 18, 2011

Page 84: An Introduction to the Zen of Python

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

Page 85: An Introduction to the Zen of Python

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.pyCreating thrice:outer(3)

Calling thrice:inner(3) (arg=3)9inner(a) (arg=3)aaa

Friday, February 18, 2011

Page 86: An Introduction to the Zen of Python

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

Page 87: An Introduction to the Zen of Python

Questions?

Friday, February 18, 2011

Page 88: An Introduction to the Zen of Python

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