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é