Questa è un'espressione generatore. Per farlo funzionare nel caso standalone, utilizzare parentesi:
y = (x for x in range(10))
e y diventa un generatore. È possibile eseguire iterazioni sui generatori, quindi funziona dove è previsto un iterable, come la funzione sum
.
Esempi di utilizzo e le insidie:
>>> y = (x for x in range(10))
>>> y
<generator object <genexpr> at 0x0000000001E15A20>
>>> sum(y)
45
stare attenti quando mantenendo i generatori in giro, si può solo andare attraverso di loro una volta. Così, dopo il precedente, se si tenta di utilizzare sum
di nuovo, questo accadrà:
>>> sum(y)
0
Quindi, se si passa un generatore di cui in realtà è previsto un elenco o un set o qualcosa di simile, bisogna stare attenti. Se la funzione o la classe memorizza l'argomento e tenta di ripetere su di esso più volte, si verificheranno dei problemi. Ad esempio si consideri questo:
def foo(numbers):
s = sum(numbers)
p = reduce(lambda x,y: x*y, numbers, 1)
print "The sum is:", s, "and the product:", p
fallirà se mano un generatore:
>>> foo(x for x in range(1, 10))
The sum is: 45 and the product: 1
Si può facilmente ottenere un elenco dei valori di un generatore produce:
>>> y = (x for x in range(10))
>>> list(y)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
È può utilizzare questo per correggere l'esempio precedente:
>>> foo(list(x for x in range(1, 10)))
The sum is: 45 and the product: 362880
Tuttavia tieni presente che se si crea un elenco da un generatore, sarà necessario memorizzare ogni valore. Questo potrebbe usare molta più memoria in situazioni in cui hai molti articoli.
Perché utilizzare un generatore nella situazione?
Il consumo di memoria molto inferiore è la ragione per cui sum(generator expression)
è meglio di sum(list)
: La versione generatore deve solo memorizzare un singolo valore, mentre l'elenco variante deve memorizzare valori N. Pertanto dovresti sempre usare un generatore dove non rischi gli effetti collaterali.
[Questo link] (http://wiki.python.org/moin/Generators) potrebbe essere utile anche. – jadkik94
Ci sono anche le definizioni di dizionario e set, nel caso non ne abbiate sentito parlare. – Amr