Para elegir solo un elemento de un generador, use break
en una for
declaració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 for
declaració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 operator
mó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 StopIteration
como 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 operator
mó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 break
en for
es convencional.