Page 1
Author: Jeff Rush <[email protected] >
Copyright: 2010 Tau Productions Inc.
License: Creative Commons Attribution-ShareAlike 3.0
Date: August 27, 2011
Duration: 50-minutes
Difficulty: intermediate
Keywords: language, techniques, data structures
A slideshow of a series of code snippets illustrating aspects of Python different fromyour usual procedural C code that may not be well-known in the community. Eachcode snippet will be discussed.
assignment (binding not copying)code block (many per source file)
a callablefunctionmethod - bound vs unboundclass, invokes __init__instance, invokes __call__
initializer method: __init__destructor method: __del__allocator method: __new____ribbed__
modulepackage (__init__.py, multi-file, hierarchy)non-package (single .py file)
distribution (grouping of modules)
What Does This Code Do?
Vocabulary Primer
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
1 of 39 09/07/2011 03:45 AM
Page 2
attribute lookupobj.attrnamegetattr(obj, "attrname")setattr(obj, "attrname", value)
mutable vs immutabletuples vs listsstrings, numbers are immutabledicts are mutablesets vs frozen sets(matters for dict keys)
Vocabulary Primer - Basic Objects
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
2 of 39 09/07/2011 03:45 AM
Page 3
a sequence vs a mappingorderingkey type (int?)dicts, lists, tuples
a set (keys-only dict)subscripting
element fetchslicing (multi-element)key lookup (aspect of entry)
iterationalways forward, never backcan be brittle if modifying
an iterable (not irritable)operations: get, set, del
Vocabulary Primer - Containers
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
3 of 39 09/07/2011 03:45 AM
Page 4
Any other terms people are puzzled by?
Vocabulary Primer - Open Discussion
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
4 of 39 09/07/2011 03:45 AM
Page 5
>>> s = "abcdefgh">>> s[3] = 'x' #FAILS
Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'str' object does not support item assignment
Strings
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
5 of 39 09/07/2011 03:45 AM
Page 6
>>> colors = ['red', 'blue', 'green', 'yellow']
>>> result = ''>>> for color in colors:... result += color
>>> result'redbluegreenyellow'
result = ''.join(colors)
More Strings
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
6 of 39 09/07/2011 03:45 AM
Page 7
What is the output and why it is wrong?
>>> def gimme(length=5):... print length>>>>>> print gimme()
5None
Every callable returns something.
Return Values
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
7 of 39 09/07/2011 03:45 AM
Page 8
>>> somedict = {'a': 1, 'b': 2}>>> list(somedict) # what do you get?
['a', 'b']
>>> d = { 'person': 'Jack', 'city': 'Conway', 'animal': 'bear' }>>> d = dict(person='Jack', city='Conway', animal='bear')
About Dictionaries
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
8 of 39 09/07/2011 03:45 AM
Page 9
>>> x = (1, 2, 3)>>> x[0]1
>>> x[0:1]
(1,)
>>> x[99]
Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: string index out of range
x[99:]
()
x[0] versus x[0:1]
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
9 of 39 09/07/2011 03:45 AM
Page 10
>>> x = [1, 2, 3]>>> x.append(4)>>> x[1, 2, 3, 4]
>>> x = [1, 2, 3]>>> x += 4
Raises an exception
>>> x += (4, )>>> x
[1, 2, 3, 4]
list.append versus list += x
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
10 of 39 09/07/2011 03:45 AM
Page 11
>>> x = 1, 2, 3 # what is x?
>>> x(1, 2, 3)
>>> a, b, c = x>>> [a, b, c] = x>>> (a, b, c) = x
>>> person = (37, ('John', 'Thomas'), 190)>>> a, (b1, b2), c = person
a = 37, b1 = 'John', b2 = 'Thomas', c = 190
Iterable Packing/Unpacking
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
11 of 39 09/07/2011 03:45 AM
Page 12
In other languages:
temp = aa = bb = temp
In Python:
b, a = a, b
b, c, a = a, b, c
Swapping Values
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
12 of 39 09/07/2011 03:45 AM
Page 13
"sort on the 2nd and 4th column"
def my_compare(item1, item2):return cmp((item1[1], item1[3]),
(item2[1], item2[3]))
container.sort(cmp=my_compare)
def my_key(item):return (item[1], item[3])
container.sort(key=my_key)
Sorting Against a Complex Key
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
13 of 39 09/07/2011 03:45 AM
Page 14
Write the following C code into a Pythonic style:
if (a == 1 | a == 3 | a == 7)...
if a in (1, 3, 7):...
constants = frozenset((1, 3, 7))...if a in constants:
...
Testing Against Multiple Values
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
14 of 39 09/07/2011 03:45 AM
Page 15
if a < b and b < c:... # How many times is b evaluated?
if a() < b() and b() < c():...
Comparison Chaining
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
15 of 39 09/07/2011 03:45 AM
Page 16
if a < b < c:...
if a() < b() < c():... # Now how many times is b evaluated?
Comparison Chaining cont'd
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
16 of 39 09/07/2011 03:45 AM
Page 17
if 10 <= x < 20:...
if x == y == z:...
if x is y is z:...
Comparison Chaining cont'd
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
17 of 39 09/07/2011 03:45 AM
Page 18
>>> x = type(5)(2)>>> x2
>>> x = 5.0...>>> y = type(x)(2.0)>>> y2.0
Making More
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
18 of 39 09/07/2011 03:45 AM
Page 19
>>> value = True>>> isinstance(value, float)False
>>> isinstance(value, (int, long, float))
True
But why is the above True?
>>> issubclass(bool, int)True
Global Function: isinstance()
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
19 of 39 09/07/2011 03:45 AM
Page 20
int.__subclasses__()[<type 'bool'>]
basestring.__subclasses__()[<type 'str'
object.__subclasses__()(long output!)
Discovering Subclasses of a Class
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
20 of 39 09/07/2011 03:45 AM
Page 21
>>> bool(1)True
>>> bool("")False
>>> bool(5.0)True
>>> bool(0.0)False
>>> bool([])False
>>> bool(dict())False
Many Things are Boolean in Nature
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
21 of 39 09/07/2011 03:45 AM
Page 22
>>> x = ''
>>> not xTrue
>>> x''
>>> not not xFalse
>>> x is TrueFalse
>>> x is FalseFalse
>>> bool(x)False
Kinds of Comparison
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
22 of 39 09/07/2011 03:45 AM
Page 23
>>> f = False>>> f and 'enabled'False
>>> f= True>>> f and 'enabled''enabled'
"and" / "or"although they are logical and not bitwise operatorsthey do NOT return a boolean!
Short-Circuit Logical Operations
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
23 of 39 09/07/2011 03:45 AM
Page 24
>>> f = False>>> f and 'enabled' or 'disabled''disabled'
>>> f = True>>> f and 'enabled' or 'disabled''enabled'
>>> statelabel = 'enabled' if globalEnableFlag else 'disabled'
>>> statelabel = ('disabled', 'enabled')[globalEnableFlag]
Short-Circuit Logical Operations (cont'd)
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
24 of 39 09/07/2011 03:45 AM
Page 25
>>> x = ('xxxx'... 'vvvvv'... 'xxxxx')
>>> x'xxxxvvvvvxxxxx'
>>> x = ('xxxx',... 'vvvvv',... 'xxxxx')
>>> x('xxxx', 'vvvvv', 'xxxxx')
Fun with Literals
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
25 of 39 09/07/2011 03:45 AM
Page 26
>>> cc_number = "1234-5678-9012-3456">>> ''.join(filter(str.isdigit, cc_number))'1234567890123456'
>>> ''.join(c for c in cc_number if c.isdigit())'1234567890123456'
>>> ss = (1, 2), (6, 7), (8, 3), (1, 8), (12, 8)>>> max(x for x, y in subsampling)12
Where Generators are Useful
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
26 of 39 09/07/2011 03:45 AM
Page 27
>>> s = "01234567ABCDEFGHabcdefgh">>> [ s[i:i+8] for i in xrange(0, len(s), 8) ]
['01234567', 'ABCDEFGH', 'abcdefgh']
What happens if the length is not a multiple of 8?
Chopping a Sequence into Fixed-Length Pieces
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
27 of 39 09/07/2011 03:45 AM
Page 28
hash = '308b1f248f914d1483281df98c296e85'sig = ':'.join(map(lambda x: hash[x:x+2], range(0, len(hash), 2)))
sig = ':'.join(hash[x:x+2] for x in range(0, len(hash), 2))
from cStringIO import StringIO
s = StringIO(hash)sig = ':'.join( iter( lambda: s.read(2), '' ) )
More Chopping a Sequence into Pieces
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
28 of 39 09/07/2011 03:45 AM
Page 29
>>> for x in range(3):... print x012
>>> values = [None] * 3>>> for values[0] in range(3):... for values[1] in range(3):... for values[2] in range(3):... print values
[0, 0, 0][0, 0, 1][0, 0, 2][0, 1, 0]...
About Iteration
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
29 of 39 09/07/2011 03:45 AM
Page 30
>>> x = "abcdefghijklmnopqrstuvwxyz"
>>> for i in range( len(x) ):... print x[i] # not Pythonic
>>> for c in x:... print x # more Pythonic
>>> for i in range( len(x) ):... print i, x[i]
>>> for i, c in enumerate(x):... print i, x
More About Iteration
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
30 of 39 09/07/2011 03:45 AM
Page 31
>>> round(2.129128, 3)2.129
>>> round(2.1667000000000001, 3)2.1669999999999998
>>> from decimal import Decimal>>> Decimal('2.1667000000000001').quantize(Decimal('.001'))Decimal('2.167')
Fractional Numbers
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
31 of 39 09/07/2011 03:45 AM
Page 32
class Container(object):
def __getitem__(self, key):print repr(key)
>>> c = Container()>>> c[3]3>>> c['orange']'orange'
>>> c[3:4]slice(3, 4, None)
>>> c[3:4:3]slice(3, 4, 3)
Object Behavior: Subscripting
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
32 of 39 09/07/2011 03:45 AM
Page 33
>>> c['apple':'lollipop']slice('apple', 'lollipop', None)
>>> c[:'lollipop']slice(None, 'lollipop', None)
>>> c[:'lollipop':100]slice(None, 'lollipop, 100)
>>> c['beagle':'terrier':'ignorecase']slice('beagle', 'terrier', 'ignorecase')
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
33 of 39 09/07/2011 03:45 AM
Page 34
>>> c[1, 2](1, 2)
>>> c[(1, 2), (3, 4)]((1, 2), (3, 4))
>>> print [1, 2, 3, 4, 5, 6, 7, 8][::2](1, 3, 5, 7)
>>> print [1, 2, 3, 4, 5, 6, 7, 8][1::2](2, 4, 6, 8)
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
34 of 39 09/07/2011 03:45 AM
Page 35
>>> x = [1, 2, 3, 4, 5, 6, 7, 8]>>> x[::2] = ['A', 'B', 'C', 'D']>>> x['A', 2, 'B', 4, 'C', 6, 'D', 8]
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
35 of 39 09/07/2011 03:45 AM
Page 36
class Alpha(object):
def fn(self):if sys.platform == 'linux2':
print xif sys.platform == 'win32':
print x
class Alpha(object):
if sys.platform == 'linux2':def fn(self):
print xif sys.platform == 'win32':
def fn(self):print x
Conditionally Creating Methods
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
36 of 39 09/07/2011 03:45 AM
Page 37
>>> class Alpha(object):...... for x in range(3):...... def fn(self):... print x...... locals()['fn_%d' % x] = fn
>>> a = Alpha()>>> a.fn_0()0>>> a.fn_1()1>>> a.fn_2()2
Dynamically Creating Methods
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
37 of 39 09/07/2011 03:45 AM
Page 38
import signalimport pdbimport time
signal.signal(signal.SIGUSR1, lambda x, y: pdb.set_trace())
while 1:print "Hello"time.sleep(5)
# note - on OSX, use signal.SIGINT instead of signal.SIGUSR1
Debugger-On-Demand
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
38 of 39 09/07/2011 03:45 AM
Page 39
Any Questions?
EAFP It's Easier to Ask Forgiveness than PermissionLBYL Look Before You LeapYAGNI You Ain't Gonna Need ItDRY Don't Repeat Yourself
Discussion
What Does This Code Do? file:///mnt/flash/talk-What_Does_This_Code_Do/talk-Wha..
39 of 39 09/07/2011 03:45 AM