[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