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('.'))