Pour choisir un seul élément d'un générateur à utiliser breakdans une forinstruction, oulist(itertools.islice(gen, 1))
Selon votre exemple (littéralement), vous pouvez faire quelque chose comme:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Si vous voulez " obtenir un seul élément du générateur [une fois généré] chaque fois que je le souhaite " (je suppose que 50% c'est l'intention d'origine et l'intention la plus courante) alors:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
De cette façon, l'utilisation explicite de generator.next()peut être évitée, et la gestion de fin d'entrée ne nécessite pas de StopIterationgestion d'exceptions (cryptique) ou de comparaisons de valeurs par défaut supplémentaires.
La section d'instructions else:of forn'est nécessaire que si vous voulez faire quelque chose de spécial en cas de fin de générateur.
Remarque sur next()/ .next():
En Python3, la .next()méthode a été renommée pour .__next__()une bonne raison: elle est considérée comme de bas niveau (PEP 3114). Avant Python 2.6, la fonction intégrée next()n'existait pas. Et il a même été discuté de passer next()au operatormodule (ce qui aurait été judicieux), en raison de son besoin rare et de l'inflation douteuse des noms intégrés.
L'utilisation next()sans défaut est toujours une pratique de très bas niveau - jetant StopIterationouvertement le cryptique comme un boulon dans le code d'application normal. Et l'utilisation next()avec la sentinelle par défaut - qui devrait être la meilleure option pour une entrée next()directe builtins- est limitée et donne souvent raison à une logique / lisibilité non pythonique étrange.
Bottom line: L'utilisation de next () devrait être très rare - comme l'utilisation des fonctions du operatormodule. En utilisant for x in iterator, islice, list(iterator)et d' autres fonctions acceptant un itérateur est en toute transparence la façon naturelle d'utiliser itérateurs au niveau de l' application - et tout à fait toujours possible. next()est de bas niveau, un concept supplémentaire, non évident - comme le montre la question de ce fil. Tandis que, par exemple, l'utilisation breakdans forest conventionnelle.