Je discuterais contre la tentation de traiter les générateurs comme des listes. L'approche simple mais naïve est le simple-liner:
gen = (i for i in range(10))
list(gen)[3]
Mais rappelez-vous, les générateurs ne sont pas comme les listes. Ils ne stockent leurs résultats intermédiaires nulle part, donc vous ne pouvez pas revenir en arrière. Je démontrerai le problème avec un exemple simple dans le rempl python:
>>> 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
Une fois que vous commencez à passer par un générateur pour obtenir la valeur n-ième dans la séquence, le générateur est maintenant dans un état différent, et en essayant de obtenir la nième valeur à nouveau vous retournera un résultat différent, ce qui entraînera probablement un bug dans votre code.
Jetons un coup d'oeil à un autre exemple, basé sur le code de la question.
On s'attendait initialement à ce que les éléments suivants impriment deux fois 4
.
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)
mais tapez ceci dans le rempl et vous obtenez:
>>> 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
Bonne chance que le traçage bug vers le bas.
Vous ne voulez pas 'is' dans cette situation (ou de nombreuses situations du tout). 'is' est pour comparer l'identité, pas l'égalité. Vous voulez '=='. Cela fonctionnera probablement dans ce cas, mais seulement par coïncidence et détails de mise en œuvre. –
Puisque j'utilise des nombres entiers, comment cela pourrait-il ne pas fonctionner? Est-ce une bonne pratique de s'attendre à ce que l'objet 'index' implémente' __eq__' dans des cas comme celui-ci? (Ceci est hors sujet ...) –
Essayez '1000 est 500 + 500', il sera (probablement)' False'. Voir, par exemple, http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers –