[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