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