[python] Diskuse: "Strucny seznam"
Martin Blazik
martin.blazik na premiumsms.cz
Pátek Říjen 7 10:06:25 CEST 2005
Cau vsem,
jen bych se potom zeptal, jak budeme nazyvat konstrukci
( x for x in xrange(10) )
ktera skutecne vraci generator seznamu.
Nevim v jake knizce jsem to cetl, ale libilo se mi oznaceni
[ x for x in xrange(10) ] - konstruktor seznamu
( x for x in xrange(10) ) - bych pouzil generator seznamu.
lachtan
Jan Svec napsal(a):
> Ahoj,
> je pekne, ze nam tady vyrostla pekna diskuze s peknym
> vysledkem. Vsem diky za navrhy a myslim si, ze mame
> viteze. Proto zahodme vsechny "strucnosti" a "sikovnosti"
> a pouzivejme GENERATOR SEZNAMU.
>
> Honza
>
> Quoting Petr Prikryl <PrikrylP na skil.cz>:
>
>> Super!
>>
>> Generátor seznamu
>>
>> Nemám sice dobré znalosti z funkcionálních jazyků
>> a přístup, který je použit v Pythonu, nepovažuji
>> za výlučně funkcionální, nicméně jsem měl na mysli
>> naprosto stejný překlad. Moje zdůvodnění vychází
>> přímo z vlastností Pythonu (generátory) a z obecného
>> principu v programovacích jazycích (konstruktor):
>>
>> 1. Syntaktický zápis (případně prázdné)
>> posloupnosti v hranatých závorkách je speciální
>> formou konstruktoru seznamu. Vzniká nový objekt
>> typu seznam a má určenou počáteční hodnotu.
>> (Zatím bez souvislosti s list comprehension,
>> podobně, jako se například apostrofům v Pascalu
>> říká konstruktor řetězce.)
>>
>> lst1 = []
>> lst2 = [ 1, 2, 3 ]
>>
>> 2. Vnitřek u list comprehension je čistokrevný
>> "generator expression" (viz 5.2.5 Generator
>> expressions), což je jen jiný zápis obecného
>> generátoru. Výsledkem je objekt generátoru.
>> Odkaz na něj má vlastnosti iterátoru (podporuje
>> metodu next()).
>>
>> 3. Dohromady je to konstruktor seznamu krmený
>> generátorem položek, tedy "generátor seznamu".
>>
>>
>> Ilustrační příklady
>> ===================
>>
>> Nejdříve výsledek list comprehension:
>>
>> >>> lst = [ x for x in xrange(10) ]
>> >>> lst
>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>
>> Vnitřní "generator expression" použitý jako obecný
>> generátor:
>>
>> >>> g = (x for x in xrange(10))
>> >>> g
>> <generator object at 0x00928080>
>> >>> for i in g:
>> ... print i
>> ...
>> 0
>> 1
>> 2
>> 3
>> 4
>> 5
>> 6
>> 7
>> 8
>> 9
>> >>> g.next()
>> Traceback (most recent call last):
>> File "<stdin>", line 1, in ?
>> StopIteration
>>
>> Konstrukci seznamu můžeme provést pomocí právě
>> takového generátoru:
>>
>> >>> g = (x for x in xrange(10))
>> >>> lst = list(g)
>> >>> lst
>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>
>> Když to zapíšeme bez pomocné refrence g,
>> dostaneme:
>>
>> >>> lst = list((x for x in xrange(10)))
>> >>> lst
>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>
>> Když 'list((' nahradíme '[' a '))' nahradíme ']',
>> dostaneme přesně "list comprehension". Jde
>> pravděpodobně jen o syntakticky jinou formu zápisu
>> téhož.
>>
>> pepr
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>>
>>
>
>
>
Další informace o konferenci Python