[python] dokumentace k novejsim rysum jazyka

David Rohleder davro na ics.muni.cz
Pátek Březen 5 00:47:23 CET 2010


Jirka Vejrazka píše v Pá 05. 03. 2010 v 00:37 +0100:
> Ahoj,
> 
> > když si tak občas čtu různé vzorové příklady, tak mám problém rozumět
> > některým novým rysům. Je tu někdo, kdo by mně řekl co znamená třeba
> >
> > [i*i for i in range(10)]
> 
> to je takzvany "list comprehension" (1), tj. definice listu "zevnitr".
> Vysledkem je list, ve kterem jsou druhe mocniny cisel 1 az 10.
> Je to zkraceny zapis tohoto:
> 
> x = []   # nebo x = list()
> for i in range(10):
>     x.append(i*i)
> 
> > a=(i*i for i in range(10))
> 
> To je totez jako predtim, jenom vysledkem neni list, ale tuple (cili
> list, ktery se po vytvoreni neda zmenit).

To mně právě nepřijde:


>>> a=(i*i for i in range(10))
>>> a.next()
0
>>> a.next()
1
>>> a.next()
4

(pak skončí výjimkou StopIteration)
čili se to chová jinak než standardní tuple, je to spíš něco, čemu se říká generátor. 

>>> b=(1,2,3)
>>> b.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'next'

Mně se takové věci celkem líbí, ale připadne mně to nějak nedomyšlené,
protože by celý ten generátor měl tvořit samostatnou syntaktickou
jednotku, tj. interpret by měl nějak sežrat zápis

>>> i*i for i in range(10)

(třeba tím, že řekne, že je to generator object)



> Da se to jeste doplnit o podminku, ktera se zapisuje az na konci, treba:
> 
> >>> delitelne_tremi = [x for x in range(20) if x % 3 == 0]
> >>> delitelne_tremi
> [0, 3, 6, 9, 12, 15, 18]
> 
>    Jirka
> (1) http://docs.python.org/tutorial/datastructures.html#list-comprehensions
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python



Další informace o konferenci Python