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.
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)
Záložky, oblíbené