Es generator.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 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 syntax 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 3.0.

Correcto, g.next() ha cambiado su nombre a g.__next__() . La razón de esto es la consistencia: los métodos especiales como __init__() y __del__ tienen dobles guiones bajos (o “dunder” en la lengua vernácula actual), y .next() fue una de las pocas excepciones a esa regla. Esto fue corregido en Python 3.0. [*]

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

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

Tratar:

 next(g) 

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

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

 import six six.next(g) # on PY2K: 'g.next()' and onPY3K: 'next(g)'