[python] generatorovy vyraz (bylo Re: nevznik objektu)

Přikryl Petr prikryl na atlas.cz
Středa Březen 24 14:33:55 CET 2010



>Od: David Rohleder
>[...] si snažím o
>objasnit některé věci. Imho jsou
>napřiklad některé z těch syntaktických 
>cukrů špatně - např. odstranění
>závorek z generátorů (i*i for i in range(4)).
>Ne, že by se na to nedalo
>zvyknout, akorát to tady trochu přehnali.

Ty závorky nejsou odstraněné. Ty závorky
nebyly nikdy potřeba... až na některé výjimky,
jako 

  g = (i*i for i in range(4))

Jde jen o specialitu, aby překladač poznal,
že to je generátorový výraz. Je to jako numerický
výraz -- taky se může zapsat do závorek.

>>> g = i*i for i in range(4)
  File "<stdin>", line 1
    g = i*i for i in range(4)
              ^
SyntaxError: invalid syntax
>>> g = (i*i for i in range(4))
>>> g
<generator object <genexpr> at 0x0282A580>

A určitě to není generátor n-tice. Tu si 
ale můžu jednoduše z generátorového výrazu
vytvořit. V níže uvedeném příkladu už ta syntaktická
specialita není nutná, takže je to tuple() s holým
generátorovým výrazem uvnitř:

>>> t = tuple(i*i for i in range(4))
>>> t
(0, 1, 4, 9)

Jde taky o to, že generátorový výraz lze napsat
na víc řádků. Tady je jiný výraz a je to pitomost,
ale pro ilustraci:

>>> g = (i*i
...        for i in range(4)
...        if i > 2)
>>> g
<generator object <genexpr> at 0x0282A648>
>>> tuple(g)
(9,)

Kdyby tam nebyly (u toho výrazu) ty závorky,
vypadal by for jako špatně odsazený... a vůbec 
by to překladači mohlo hodně zamotat hlavu.
Nehledě na to, že by se to for mohlo odsadit 
stejně jako g a pak už by to bylo úplně divné.

pepr


Další informace o konferenci Python