在python 3.0中可以看到generator.next()吗?

我有一个生成一个系列的发生器,例如:

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

在Python 2.6中,我可以进行以下调用:

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

然而在3.0如果我执行相同的两行代码,我得到以下错误:

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

但是,循环迭代器语法在3.0中工作

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

我还没有find任何解释3.0中的这种行为差异的东西。

正确的, g.next()已经重命名为g.__next__() 。 原因是有一致性。 像__init__()__del__这样的特殊方法都有双下划线(或“dunder”,因为它现在变得stream行起来了),而.next()是该规则的less数例外之一。 Python 3.0修复了这个问题。 [*]

但是,不要像next(g)那样调用g.__next__() ,就像Paolo说的那样。

[*]有更多的特殊属性谁得到了这个修复,如function属性。 不再是func_name ,现在是__name__

尝试:

 next(g) 

看看这个整洁的表格 ,它显示了2和3之间的语法差异。

如果您的代码必须在Python2和Python3下运行,请使用如下所示的2to3 六库:

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