Edit detail for BePythonic revision 2 of 1

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/




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)