Verwenden Sie zum Auswählen nur eines Elements eines Generators break
in einer for
Anweisung oderlist(itertools.islice(gen, 1))
Nach Ihrem Beispiel (im wahrsten Sinne des Wortes) können Sie Folgendes tun:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Wenn Sie " nur ein Element vom [einmal generierten] Generator erhalten möchten , wann immer ich möchte " (ich nehme an, 50% sind die ursprüngliche Absicht und die häufigste Absicht), dann:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
Auf diese Weise kann die explizite Verwendung von generator.next()
vermieden werden, und die Behandlung am Ende der Eingabe erfordert keine (kryptische) StopIteration
Ausnahmebehandlung oder zusätzliche Standardwertvergleiche.
Der Abschnitt mit else:
der for
Anweisung wird nur benötigt, wenn Sie im Falle eines Generatorendes etwas Besonderes tun möchten.
Hinweis zu next()
/ .next()
:
In Python3 wurde die .next()
Methode .__next__()
aus gutem Grund umbenannt: Sie gilt als Low-Level (PEP 3114). Vor Python 2.6 existierte die eingebaute Funktion next()
nicht. Und es wurde sogar diskutiert, next()
auf das operator
Modul umzusteigen (was klug gewesen wäre), da es nur selten benötigt wird und die eingebauten Namen fragwürdig aufgeblasen sind.
Die Verwendung next()
ohne Standard ist immer noch eine sehr einfache Übung - das Werfen der Kryptik StopIteration
wie ein Blitz aus heiterem Himmel im normalen Anwendungscode offen. Und die Verwendung next()
mit Standard-Sentinel - was am besten die einzige Option für ein next()
direktes In sein sollte builtins
- ist begrenzt und führt häufig zu ungerader nicht-pythonischer Logik / Lesbarkeit.
Fazit: Die Verwendung von next () sollte sehr selten sein - wie die Verwendung von Funktionen des operator
Moduls. Mit for x in iterator
, islice
, list(iterator)
und anderen Funktionen einen Iterator nahtlos zu akzeptieren ist die natürliche Art und Weise von Iteratoren auf Anwendungsebene mit - und ganz immer möglich. next()
ist Low-Level, ein zusätzliches Konzept, nicht offensichtlich - wie die Frage dieses Threads zeigt. Während zB die Verwendung break
in for
ist konventionell.