Pour choisir un seul élément d'un générateur à utiliser break
dans une for
instruction, 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 StopIteration
gestion d'exceptions (cryptique) ou de comparaisons de valeurs par défaut supplémentaires.
La section d'instructions else:
of for
n'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 operator
module (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 StopIteration
ouvertement 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 operator
module. 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 break
dans for
est conventionnelle.