10.1. Good Practices

10.1.1. Rationale

../../_images/goodpractices-programmer-exp.png

Figure 10.1. Code Complexity vs. Programmer Experience

10.1.2. Range

Listing 10.1. Replace it with range()
i = 0

while i < ...:
    i += 1

10.1.3. Enumerate

Listing 10.2. Replace it with enumerate()
i = 0

for ...:
    value = DATA[i]
    i += 1

10.1.4. Sum

Listing 10.3. Replace it with sum()
total = 0

for ...:
    total += ...

10.1.5. Zip

Listing 10.4. Replace it with zip()
header = [...]
values = [...]

for ...:
    header[i]
    values[i]

10.1.6. List Comprehension

Listing 10.5. Replace it with list comprehension
result = list()

for ...:
    result.append(...)

10.1.7. Dict Comprehension

Listing 10.6. Replace it with dict comprehension
result = dict()

for ...:
    result[...] = ...

10.1.8. Set Comprehension

Listing 10.7. Replace it with set comprehension
result = set()

for ...:
    result.add(...)

10.1.9. Map

Listing 10.8. Replace it with map()
result = (func(x) for x in DATA)
result = map(func, DATA)

10.1.10. Filter

Listing 10.9. Replace it with filter()
result = (x for x in DATA if func(x))
result = filter(func, DATA)

10.1.11. Str

result = str[-3:] == 'osa'
result = str.endswith('osa')

result = str[-3:] == 'osa' or str[-2:] == 'ca'
result = str.endswith(('osa', 'ca'))
result = str[:1] == 'v'
result = str.startswith('v')

result = str[:1] == 'v' or str[:1] == 's'
result = str.startswith(('v', 's'))
Listing 10.10. Replace with str.join()
data = ['line1', 'line2', 'line3']

result = [line + '\n' for line in data]
result = '\n'.join(data)

10.1.12. Others

Listing 10.11. The same for ...
all(), any(), iter(), next()

10.1.13. Functools

from functools import *

reduce(function, iterable[, initializer])

10.1.14. Itertools

from itertools import *

count(start=0, step=1)
cycle(iterable)
repeat(object[, times])
accumulate(iterable[, func, *, initial=None])
chain(*iterables)
compress(data, selectors)
islice(iterable, start, stop[, step])
starmap(function, iterable)
product(*iterables, repeat=1)
permutations(iterable, r=None)
combinations(iterable, r)
combinations_with_replacement(iterable, r)
groupby(iterable, key=None)

10.1.15. The Zen of Python

import this

10.1.15.1. English

  • 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!

10.1.15.2. Polish

  • Piękne jest lepsze niż brzydkie.

  • Wyrażone wprost jest lepsze niż domniemane.

  • Proste jest lepsze niż złożone.

  • Złożone jest lepsze niż skomplikowane.

  • Płaskie jest lepsze niż wielopoziomowe.

  • Rzadkie jest lepsze niż gęste.

  • Czytelność się liczy.

  • Sytuacje wyjątkowe nie są na tyle wyjątkowe, aby łamać reguły.

  • Choć praktyczność przeważa nad konsekwencją.

  • Błędy zawsze powinny być sygnalizowane.

  • Chyba że zostaną celowo ukryte.

  • W razie niejasności powstrzymaj pokusę zgadywania.

  • Powinien być jeden -- i najlepiej tylko jeden -- oczywisty sposób na zrobienie danej rzeczy.

  • Choć ten sposób może nie być oczywisty jeśli nie jest się Holendrem.

  • Teraz jest lepsze niż nigdy.

  • Chociaż nigdy jest często lepsze niż natychmiast.

  • Jeśli rozwiązanie jest trudno wyjaśnić, to jest ono złym pomysłem.

  • Jeśli rozwiązanie jest łatwo wyjaśnić, to może ono być dobrym pomysłem.

  • Przestrzenie nazw to jeden z niesamowicie genialnych pomysłów -- miejmy ich więcej!