我有产生一系列的发电机,例如:

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

我没能尚未找到任何解释这种行为差异为3.0。

有帮助吗?

解决方案

正确,g.next()已更名为g.__next__()。这样做的原因是一致性:特殊的方法,如__init__()__del__都有双下划线(或在当前白话“dunder”),并.next()是为数不多的例外是规则之一。这被固定在Python 3.0。 [*]

但是,而不是调用g.__next__(),如保罗说,使用next(g)

[*]有迹象表明,已经得到了此修复等特殊属性; func_name,现已__name__

其他提示

尝试:

next(g)

查核此整齐表示出,当涉及到本2和3之间的语法差异。

如果您的代码必须Python2和Python3下运行,使用2to3的 6个库这样的:

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top