no hay función next () en un generador de rendimiento en Python 3

84

En esta pregunta , tengo una secuencia interminable usando generadores de Python. Pero el mismo código no funciona en Python 3 porque parece que no hay next()función. ¿Cuál es el equivalente de la nextfunción?

def updown(n):
    while True:
        for i in range(n):
            yield i
        for i in range(n - 2, 0, -1):
            yield i

uptofive = updown(6)
for i in range(20):
    print(uptofive.next())
Max
fuente
¿Cómo funciona este código? Entiendo que sí funciona, pero por lo que leí, "La ejecución del código se detiene cuando se alcanza una declaración de rendimiento". ( python-course.eu/python3_generators.php ). Entonces, en el primero for i in range(n), ¿por qué no yielddevuelve simplemente "1"? En cambio, después del primer valor en el rango, el código continúa y produce el rango completo, que para mí parece ser que el rendimiento se llama varias veces a la vez. Me cuesta un poco entender los matices.
Mike S
La primera vez que forllama al objeto generador creado a partir de su función, ejecutará el código en su función desde el principio hasta que llegue yield, luego devolverá el primer valor del ciclo. Luego, cada llamada ejecutará el ciclo que ha escrito en la función una vez más y devolverá el siguiente valor, hasta que no haya ningún valor para devolver. (tomado de este tutorial )
Mattia Paterna

Respuestas:

123

En Python 3, use en next(uptofive)lugar de uptofive.next().

La next()función incorporada también funciona en Python 2.6 o superior.

Greg Hewgill
fuente
36
Whyyyyyyyyyyyyyy
Kenny Worden
44

En Python 3, para que la sintaxis sea más coherente, next()se cambió el nombre del método a __next__(). Podrías usar ese. Esto se explica en PEP 3114 .

Se recomienda seguir la solución de Greg y llamar a la función incorporadanext() (que luego intenta encontrar el __next__()método de un objeto ).

cfi
fuente
1
Particularmente porque la función es portable entre las versiones 2 y 3, mientras que los métodos (debido al cambio de nombre) no lo son.
holdenweb