Para elegir solo un elemento de un generador, use breaken una fordeclaración, olist(itertools.islice(gen, 1))
Según su ejemplo (literalmente) puede hacer algo como:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Si desea " obtener solo un elemento del generador [una vez generado] cuando quiera " (supongo que el 50% es la intención original y la intención más común) entonces:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
De esta manera, generator.next()se puede evitar el uso explícito de , y el manejo de fin de entrada no requiere (críptico)StopIteration manejo de excepciones o comparaciones de valores predeterminados adicionales.
La sección else:de fordeclaración solo es necesaria si desea hacer algo especial en caso de fin de generador.
Nota sobre next()/ .next():
En Python3 .next()se cambió el nombre del método .__next__()por una buena razón: se considera de bajo nivel (PEP 3114). Antes de Python 2.6, la función integrada next()no existía. E incluso se discutió la posibilidad de pasar next()al operatormódulo (lo que habría sido prudente), debido a su rara necesidad y la cuestionable inflación de los nombres incorporados.
Usar next()sin valor predeterminado sigue siendo una práctica de muy bajo nivel: lanzar el críptico StopIterationcomo un rayo de la nada en el código de aplicación normal abiertamente. Y usar next()con centinela predeterminado, que mejor debería ser la única opción para un next()directamente enbuiltins , es limitado y a menudo da razón a una lógica / legibilidad no pitónica extraña.
En pocas palabras: Usar next () debería ser muy raro, como usar funciones del operatormódulo. El uso de for x in iterator, islice, list(iterator)y otras funciones de aceptar un iterador sin problemas es la forma natural de usar iteradores de nivel de aplicación - y bastante siempre es posible. next()es de bajo nivel, un concepto adicional, no obvio, como lo muestra la pregunta de este hilo. Mientras que, por ejemplo, el uso breaken fores convencional.