Notes from Raymond Hettinger’s talk at pycon US 2013:
- Transforming Code into Beautiful, Idiomatic Python,
- Transforming code into Beautiful, Idiomatic Python by Raymond Hettinger,
- Gist Doc.
1. Looping over a range of numbers
# these two for loop method are equal.
for i in [0,1,2,3,4,5]:
print i
for i in range(6):
print i
# Better method: use xrange in python 2.7; use range in python3
for i in xrange(6):
print i
2. Looping backward
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)-1, -1, -1):
print colors[i]
# Better method: use reversed
for color in reversed(colors):
print color
3. looping over collection and indices
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
print i, '--->', colors[i]
# Better Method: use enumerate
for i, color in enumerate(colors):
print i, '--->', color
4. Distinguishing multiple exit points in loops
def find(seq, target):
found = False
for i, value in enumerate(seq):
if value == target:
found = True
break
if not found: return -1
return i
##### Better: use "for else"
def find(seq, target):
for i, value in enumerate(seq):
if value == target: break
else: return -1
return i
5. Looping over dictionary keys and values
# Not very fast, has to re-hash every key and do a lookup
for k in d:
print k, '--->', d[k]
# Makes a big huge list
for k, v in d.items():
print k, '--->', v
# Better use: iteritems()
for k, v in d.iteritems():
print k, '--->', v
iteritems()
is better as it returns an iterator.
6. Counting with dictionaries
colors = ['red', 'green', 'red', 'blue', 'green', 'red']
# Simple, basic way to count. A good start for beginners.
d = {}
for color in colors:
if color not in d: d[color] = 0
d[color] += 1
# {'blue': 1, 'green': 2, 'red': 3}
# Slightly more modern but has several caveats, better for advanced users
# who understand the intricacies
d = defaultdict(int)
for color in colors:
d[color] += 1
7. Grouping with dictionaries
names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
# In this example, we're grouping by name length
d = {}
for name in names:
key = len(name)
if key not in d:
d[key] = []
d[key].append(name)
# {5: ['roger', 'betty'], 6: ['rachel', 'judith'], 7: ['raymond', 'matthew', 'melissa', 'charlie']}
##### Better
d = defaultdict(list)
for name in names:
key = len(name)
d[key].append(name)