2 | ||
Editor: geon
Time: 2009/04/12 08:13:24 GMT+2 |
||
Note: |
changed: - 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) Záložky, oblíbené ------------------ - http://dirtsimple.org/2004/12/python-is-not-java.html - http://www.python.org/dev/peps/pep-0008/
Postaveno na základech http://shalabh.infogami.com/Be_Pythonic2.
Š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)
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 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)
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.
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 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)