Discutiría contra la tentación de tratar generadores como listas. El enfoque simple pero ingenua es el simple de una sola línea:
gen = (i for i in range(10))
list(gen)[3]
Pero recuerde, los generadores no son como las listas. No almacenan sus resultados intermedios en ninguna parte, por lo que no puede retroceder. Voy a demostrar el problema con un ejemplo sencillo en el repl pitón:
>>> 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
vez que empiece a ir a través de un generador para obtener el valor de orden n en la secuencia, el generador se encuentra ahora en un estado diferente, e intentar obtener el enésimo valor nuevamente le devolverá un resultado diferente, lo que probablemente resultará en un error en su código.
Echemos un vistazo a otro ejemplo, basado en el código de la pregunta.
Inicialmente se esperaba lo siguiente para imprimir 4
dos veces.
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)
pero escribir esto en el repl y se obtiene:
>>> 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
Buena suerte trazando ese insecto hacia abajo.
Usted no quiere 'is' en esta situación (o muchas situaciones en absoluto). 'is' es para comparar identidad, no igualdad. Quieres '=='. Esto probablemente funcionará en esta instancia, pero solo por coincidencia y detalles de implementación. –
Como uso números enteros, ¿cómo podría no funcionar? ¿Es incluso una buena práctica esperar que el objeto 'index' implemente' __eq__' en casos como este? (Esto se está saliendo del tema ...) –
Pruebe '1000 es 500 + 500', será (probablemente)' False'. Ver, por ejemplo, http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers –