Para recoger sólo un elemento de un uso generador de break
en un comunicado for
, o list(itertools.islice(gen, 1))
De acuerdo con el ejemplo (literalmente) se puede hacer como:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Si desea "obtener jus t un elemento del [una vez generada] generador cuando me gusta "(supongo 50% eso 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()
esta manera uso explícito de generator.next()
puede haber evitado, y el manejo del final de la entrada no requiere (críptico) StopIteration
manejo de excepciones o comparaciones de valores por defecto adicionales.
La sección de enunciado else:
de solo es necesaria si desea hacer algo especial en caso de fin de generador.
Nota sobre next()
/.next()
:
En python3 el método .next()
se renombró a .__next__()
por una buena razón: su bajo nivel considerado (PEP 3114). Antes de Python 2.6, la función integrada next()
no existía. Y hasta se discutió para mover next()
al módulo operator
(lo que habría sido acertado), debido a su rara necesidad y al cuestionable inflado de los nombres incorporados.
El uso de next()
sigue siendo una práctica de nivel muy bajo - arrojando el críptico StopIteration
como un perno 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 en builtins
- es limitado y a menudo le da razón a la lógica/legibilidad no-pitónica impar.
En pocas palabras: Usar next() debería ser muy raro, como usar las funciones del módulo operator
. Usar for x in iterator
, islice
, list(iterator)
y otras funciones que acepten un iterador sin problemas es la forma natural de usar iteradores en el nivel de aplicación, y siempre es posible. next()
es de bajo nivel, un concepto adicional, no obvio, como lo muestra la pregunta de este hilo. Mientras, por ejemplo, utilizando break
en for
es convencional.
Nota, solo aumentará StopIteration cuando intente usar g.next() después de que se haya proporcionado el último elemento en g. – Wilduck
'next (gen, default)' también se puede usar para evitar la excepción 'StopIteration'. Por ejemplo 'next (g, None)' para un generador de cadenas producirá una cadena o None una vez que la iteración haya finalizado. – Attila
en Python 3000, siguiente() es __next __() –