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.
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.
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.
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)'
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