[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