[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