Ich würde gegen die Versuchung argumentieren, Generatoren wie Listen zu behandeln. Der einfache, aber naive Ansatz ist der einfache Einzeiler:
gen = (i for i in range(10))
list(gen)[3]
Aber denken Sie daran, Generatoren sind keine Listen. Sie speichern ihre Zwischenergebnisse nirgendwo, sodass Sie nicht rückwärts gehen können. Ich werde das Problem anhand eines einfachen Beispiels in der Python-Antwort demonstrieren:
>>> 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
Sobald Sie einen Generator durchlaufen, um den n-ten Wert in der Sequenz zu erhalten, befindet sich der Generator jetzt in einem anderen Zustand. Wenn Sie versuchen, den n-ten Wert erneut abzurufen, erhalten Sie ein anderes Ergebnis, das wahrscheinlich zu einem Fehler in Ihrem führt Code.
Schauen wir uns ein anderes Beispiel an, das auf dem Code aus der Frage basiert.
Man würde zunächst erwarten, dass das Folgende 4
zweimal gedruckt wird.
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)
aber tippe dies in die Antwort und du erhältst:
>>> 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
Viel Glück beim Aufspüren dieses Fehlers.
BEARBEITEN:
Wenn der Generator unendlich lang ist, können Sie ihn nicht einmal in eine Liste konvertieren. Der Ausdruck list(gen)
wird niemals enden.
Es gibt eine Möglichkeit, einen träge ausgewerteten Caching-Wrapper um einen unendlichen Generator zu legen, damit er wie eine unendlich lange Liste aussieht, in die Sie nach Belieben indizieren können. Dies verdient jedoch eine eigene Frage und Antwort und hätte erhebliche Auswirkungen auf die Leistung.
is
in dieser Situation (oder in vielen Situationen überhaupt).is
dient zum Vergleich der Identität, nicht der Gleichheit. Du willst==
. Dies wird in diesem Fall wahrscheinlich funktionieren, jedoch nur durch Zufall und Implementierungsdetails.