[python] Diskuse: "Strucny seznam"

Jan Svec honza na py.cz
Pátek Říjen 7 09:23:54 CEST 2005


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
>
>
>



-- 
S pozdravem
Jan Svec
<honza na py.cz>
http://py.cz




Další informace o konferenci Python