[python] Generator a generatorovy vyraz (bylo RE: Diskuse: "Strucny seznam")

Petr Prikryl PrikrylP na skil.cz
Pátek Říjen 7 11:24:28 CEST 2005


Jaroslav Pachola
> Martin Blazik napsal(a):
> > [...] jak budeme nazyvat konstrukci
> > ( x for x in xrange(10) )
> > ktera skutecne vraci generator seznamu.
> > [...]
> 
> [...] Tvuj navrh se mi libi a mas s tim 
> generatorem castecne pravdu, nicmene ten 
> "generator expression" neni generator seznamu, 
> ale proste jenom generator. [...] jako 
> logicky preklad "generator expression" mi pripada 
> "generatorovy vyraz".

Tak, tak. Jako "generátorový výraz" to už má
Honza Švec dávno přeložené 
v http://www.py.cz/DoporuceniProPreklad

Pythonovská dokumentace mu věnuje samostatnou
část "5.2.5 Generator expressions" a asi na 
tom není co dalšího vymýšlet.

Stejný generátor, ale ne pomocí výrazu a bez
xrange(), lze definovat takto:

def g():
    i = 0
    while i < 10:
        yield i
        i += 1

for x in g():
    print x


On je ve skutečnosti ten příklad
( x for x in xrange(10) )
takový trochu umělý, protože samotné
xrange() je generátor a mohlo by být takto 
(pokud neuvažujeme nepovinné parametry):

def moje_xrange(n):
    i = 0
    while i < n:
        yield i
        i += 1

for x in moje_xrange(20):
    print x

Z tohoto příkladu je taky vidět, proč
by se mělo použití xrange() dávat přednost
před range(). Zatímco xrange() je prostý
generátor, range() je generátor seznamu.
Při použití range() se tedy napřed fyzicky
vytvoří seznam čísel (může být i dost velký).
Pokud jej použijeme pro získávání indexů
v cyklu for, tak jej na konci zase zahodíme
(garbage collection).

pepr



Další informace o konferenci Python