Contro la tentazione di trattare i generatori come elenchi. L'approccio semplice ma ingenuo è la semplice one-liner:
gen = (i for i in range(10))
list(gen)[3]
Ma ricordate, i generatori non sono come liste. Non memorizzano i risultati intermedi da nessuna parte, quindi non puoi tornare indietro. Io dimostrare il problema con un semplice esempio nella repl pitone:
>>> gen = (i for i in range(10))
>>> list(gen)[3]
3
>>> list(gen)[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Una volta che si inizia a passare attraverso un generatore per ottenere il valore n-esimo della sequenza, il generatore è ora in uno stato diverso, e il tentativo di ottenere di nuovo l'ennesimo valore ti restituirà un risultato diverso, che probabilmente causerà un bug nel tuo codice.
Diamo un'occhiata a un altro esempio, basato sul codice della domanda.
Si prevede inizialmente quanto segue per stampare 4
due volte.
gen = (i for i in range(10))
index = 4
for i, v in enumerate(gen):
if i == index:
answer = v
break
print(answer)
for i, v in enumerate(gen):
if i == index:
answer = v
break
print(answer)
ma digitare questo nella repl e si ottiene:
>>> gen = (i for i in range(10))
>>> index = 4
>>> for i, v in enumerate(gen):
... if i == index:
... answer = v
... break
...
>>> print(answer)
4
>>> for i, v in enumerate(gen):
... if i == index:
... answer = v
... break
...
>>> print(answer)
9
Buona fortuna tracciamento bug che verso il basso.
fonte
2017-05-30 21:48:52
Non si vuole 'is' in questa situazione (o molte situazioni del tutto). 'is' è per confrontare l'identità, non l'uguaglianza. Vuoi '=='. Questo probabilmente funzionerà in questo caso, ma solo per coincidenza e dettaglio di implementazione. –
Poiché utilizzo gli interi, come potrebbe non funzionare? È addirittura buona norma aspettarsi che l'oggetto 'index' implementa' __eq__' in casi come questo? (Questo sta diventando fuori tema ...) –
Prova '1000 è 500 + 500', sarà (probabilmente) essere' Falso'. Vedi, ad esempio, http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers –