Buďte Pythonýry!

Postaveno na základech http://shalabh.infogami.com/Be_Pythonic2.

Pomocné indexy používejte zřídka, iterátory jen občas

Špatně:

i = 0
while i<10:
     necoUdelej(i)
     i = i + 1

Pythonýrsky:

for i in xrange(10):
    necoUdelej(i)

Špatně:

i = 0
while i < len(L):
    print L[i]
    i = i+1

Pythonýrsky:

for polozka in L:
    print polozka

Iterátor je vhodný, když potřebujete zachovat stav cyklu mezi dvěma cykly:

itrL = iter(L)

for polozka in itrL:
    necoUdelej(polozka)
    if nejaka_podminka(polozka):
        break

for polozka in itrL:    # continues where previous loop left off
    necoJinehoUdelej(polozka)

Někdy smyčka ani není potřeba

Jazyk Pythoh poskytuje mnoho vysokoúrovňových funkcí, které se používají na posloupnostech - jako například zip(), max(), min(), generátory seznamů atd. Je vysoce pythonýrské uchovávat data v n-ticích, seznamech a slovnících a provádět operace nad celou posloupností najednou. Zde je například kód, který čte CVS soubor, kde první řádek jsou jména sloupců), převádí každou řádku do do položky slovníku a počítá součet sloupce "mnozstvi":

radky = open('filename.csv').readlines()
jmenaSloupcu = radky[0].split(',')
zaznamy = [dict(zip(jmenaSloupcu, radka.split(',')))  for radka in radky[1:]]
print sum([int(zaznam['mnozstvi'])  for zaznam in zaznamy])

Přestože je tento příklad trochu lichý (je lepší použít přímo modul csv), ukazuje se zde mocnost některých technik. Použitím zip() s dict() můžete spojit n-tici jmen sloupců s n-tici hodnot a vytvořit slovník. V kombinaci s generátorem seznamu můžete vše vytvořit seznam v jednom kroku.

N-tice nejsou jen seznamy pro čtení

N-tice obvykle obsahují heterogenní vazby, např. (jmeno, prijmeni) nebo (ip_adresa, port). Rozložení n-tic je velmi užitečná technika:

for (ip_adresa, port) in all_connections:
    if port<2000:
        print 'Adresa %s pripojena k %s' % (ip_adresa, port)

Narazíte-li na takový druh smyčky, je vám jasné, že all_connections je seznam (neno iterovatelný typ), který obsahuje n-tice ve tvaru (ip_adresa, port). Je to o mnoho čitelnější než:

# špatně
for polozka in all_connections:
    print polozka[0], polozka[1]

Rozložení n-tic se použivá při návratu několika hodnot z funkce:

jmeno, pripona = os.path.splitext(jemenoSouboru)

Třídy nejsou jen kontejnery pro užitečné metody

C# a Java mohou obsahovat kód pouze uvnitř tříd a tak to často končí mnoha třídami,které obsahují pouze statické metody. Krásný příklad jsou matematické funkce jako například sin(). V Pythonu proti tomu však použíjte poze modul s hlavními funkcemi.

Odmítněte getters a setters

Ano, zapouzdření je důležité. Ne, getters a setters nejsou jediná cesta jak implementovat zapouzdření. V Pythonu můžete použít properties a nahradit tak členskou proměnnou. Pak můžete zcela změnit implementační mechanismus beze změn jakéhokoliv volacího kódu.

GetSetProperty

Funkce jsou objekty

Funkce je volatelný objekt. To je velmi příjemná vlastnost v mnoha situacích. Jeden příklad za všechny:

def soucet(a,b):
    return a+b

def soucin(a,b):
    return a*b

operace=[soucet, soucin]
for op in operace:
    print op(5,10)