¿Cómo obtener un valor a la vez de una función generadora en Python?

113

Pregunta muy básica: ¿cómo obtener un valor de un generador en Python?

Hasta ahora he descubierto que puedo conseguir uno escribiendo gen.next(). Solo quiero asegurarme de que esta sea la forma correcta.

bodacydo
fuente

Respuestas:

154

Sí, o next(gen)en 2.6+.

Ignacio Vázquez-Abrams
fuente
3
Sé que esto es vergonzoso porque ¿por qué no funciona? W1 = params.next()pero aparece un errorAttributeError: 'generator' object has no attribute 'next'
Charlie Parker
2
@CharlieParker ¡Debes estar usando Python 3!
Akshay Lokur
66

En Python <= 2.5, use gen.next(). Esto funcionará para todas las versiones de Python 2.x, pero no para Python 3.x

En Python> = 2.6, use next(gen). Esta es una función incorporada y es más clara. También funcionará en Python 3.

Ambos terminan llamando a una función con un nombre especial next(), que puede anularse mediante subclases. En Python 3, sin embargo, se ha cambiado el nombre de esta función para __next__()que sea coherente con otras funciones especiales.

Christian Oudard
fuente
16

Usar (para python 3)

next(generator)

Aquí hay un ejemplo

def fun(x):
    n = 0
    while n < x:
        yield n
        n += 1
z = fun(10)
next(z)
next(z)

debería imprimir

0
1
dshri
fuente
2

Para obtener el valor asociado con un objeto generador en python 3 y superior, use next(<your generator object>). las llamadas posteriores a next () producen valores de objeto sucesivos en la cola.

Ryukendo Dey
fuente
1

En Python 3 no tiene gen.next(), pero aún puede usar next(gen). Un poco extraño si me preguntas, pero así es.

Niki.py
fuente
1
No es tan extraño. Se supone que Python 3 rompe cosas y solo permite el mejor código más claro. No tener compatibilidad con versiones anteriores es el punto de algunos cambios importantes.
Tatarizar