Es generador.next () visible en python 3.0?


Tengo un generador que genera una serie, por ejemplo:

def triangleNums():
    '''generate series of triangle numbers'''
    tn = 0
    counter = 1
    while(True):
        tn = tn + counter
        yield tn
        counter = counter + 1

En python 2.6 puedo hacer las siguientes llamadas:

g = triangleNums() # get the generator
g.next()           # get next val

Sin embargo, en la versión 3.0 si ejecuto las mismas dos líneas de código, obtengo el siguiente error:

AttributeError: 'generator' object has no attribute 'next'

Pero, la sintaxis del iterador de bucle funciona en 3.0

for n in triangleNums():
    if not exitCond:
       doSomething...

Todavía no he podido encontrar nada que explique esta diferencia de comportamiento para la versión 3.0.

Author: Craig McQueen, 2009-07-02

3 answers

Correcto, g.next() ha sido renombrado a g.__next__(). La razón de esto es la consistencia: Métodos especiales como __init__() y __del__ todos tienen guiones bajos dobles (o "dunder" en la lengua vernácula actual), y .next() fue una de las pocas excepciones a esa regla. Esto se solucionó en Python 3.0. [*]

Pero en lugar de llamar g.__next__(), como dice Paolo, use next(g).

[*] Hay otros atributos especiales que han obtenido esta corrección; func_name, ahora es __name__, etc.

 295
Author: Lennart Regebro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 05:03:01

Intenta:

next(g)

Echa un vistazo a esta tabla ordenada que muestra las diferencias en la sintaxis entre 2 y 3 cuando se trata de esto.

 102
Author: Paolo Bergantino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-27 03:52:45

Si su código debe ejecutarse bajo Python2 y Python3, use la biblioteca 2to3 six así:

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
 10
Author: danius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-17 17:09:59