[python] Diskuse: "Strucny seznam"
Petr Prikryl
PrikrylP na skil.cz
Čtvrtek Říjen 6 15:40:32 CEST 2005
slacker
> Tipoval bych, ze tuto vlastnost prevzal Python z
> fukncionalnich programovacich jazyku. No a pokud
> je mi znamo, tak se teto konstrukci vzdy rikalo
> "generator seznamu". Takze termin "strucny seznam"
> je asi opravdu trochu mimo.
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
Další informace o konferenci Python