Edit detail for Generatory revision 2 of 1

2
Editor: mol
Time: 2010/01/02 15:57:40 GMT+1
Note: Generátory seznamu

changed:
-
Generátory
----------------
Generátor je funkce, která si pamatuje všechny své proměnné i místo opuštění a při každém volání se vrací na původní místo a pokračuje, kde skončila (obyčejná funkce začíná při každém svém volání vždy na svém začátku). Opuštění funkce a předání nějaké hodnoty se děje pomocí *yield*. Typické použití je tvorba ID, jmen či sériových čísel.

Příklad::

    def genID(pocatek=0):
        v = pocatek
        while v < pocatek + 1000:
            yield "ID_%05d" % v
            v += 1
        return

    generator = genID() # vytvori generator
    for i in range(10): # generuje 10 hodnot
        print generator.next()

Generátorové výrazy
---------------------
Generátorové výrazy jsou podobné generátorům seznamů s tím, že nevracejí seznam celý, ale prvek po prvku, podobně jako iterátory (IteratorIterable). Používá se hlavně pro dlouhé posloupnosti. Generátorové výrazy se uzavírají do obyčejných závorek, narozdíl od generátorů seznamů, které mají závorky hranaté.

Příklad::

    import os
    seznamSouboruIter = (soubor for soubor in os.listdir(".") if os.path.isfile(soubor))
    print seznamSouboruIter
    for soubor in seznamSouboruIter:
        print soubor


Generátory seznamu (list comprehensions)
------------------------------------------
Tvorba seznamů snad jednodušším způsobem. Příklad::

    import os
    seznamSouboru = [soubor for soubor in os.listdir(".") if os.path.isfile(soubor)]
    print seznamSouboru

    # Klasicky by to bylo takhle:
    seznamSouboru=[]
    for soubor in os.listdir("."):
        if os.path.isfile(soubor):
            seznamSouboru.append(soubor)
           
    print seznamSouboru 



From mol Sat Jan 2 15:57:40 +0100 2010
From: mol
Date: Sat, 02 Jan 2010 15:57:40 +0100
Subject: Generátory seznamu
Message-ID: <20100102155740+0100@www.py.cz>

Ten příklad není IMHO nejšťastnější, protože existuje mnohem kratší řešení:
seznamSouboru = filter(os.path.isfile, os.listdir('.'))

Generátory

Generátor je funkce, která si pamatuje všechny své proměnné i místo opuštění a při každém volání se vrací na původní místo a pokračuje, kde skončila (obyčejná funkce začíná při každém svém volání vždy na svém začátku). Opuštění funkce a předání nějaké hodnoty se děje pomocí yield. Typické použití je tvorba ID, jmen či sériových čísel.

Příklad:

def genID(pocatek=0):
    v = pocatek
    while v < pocatek + 1000:
        yield "ID_%05d" % v
        v += 1
    return

generator = genID() # vytvori generator
for i in range(10): # generuje 10 hodnot
    print generator.next()

Generátorové výrazy

Generátorové výrazy jsou podobné generátorům seznamů s tím, že nevracejí seznam celý, ale prvek po prvku, podobně jako iterátory (IteratorIterable). Používá se hlavně pro dlouhé posloupnosti. Generátorové výrazy se uzavírají do obyčejných závorek, narozdíl od generátorů seznamů, které mají závorky hranaté.

Příklad:

import os
seznamSouboruIter = (soubor for soubor in os.listdir(".") if os.path.isfile(soubor))
print seznamSouboruIter
for soubor in seznamSouboruIter:
    print soubor

Generátory seznamu (list comprehensions)

Tvorba seznamů snad jednodušším způsobem. Příklad:

import os
seznamSouboru = [soubor for soubor in os.listdir(".") if os.path.isfile(soubor)]
print seznamSouboru

# Klasicky by to bylo takhle:
seznamSouboru=[]
for soubor in os.listdir("."):
    if os.path.isfile(soubor):
        seznamSouboru.append(soubor)

print seznamSouboru

Generátory seznamu --mol, Sat, 02 Jan 2010 15:57:40 +0100 reply

Ten příklad není IMHO nejšťastnější, protože existuje mnohem kratší řešení: seznamSouboru = filter(os.path.isfile, os.listdir('.'))