被generator.next()在Python 3.0可见?被generator.next()在P

2019-05-14 11:54发布

我有一个生成一个系列,例如发电机:

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这种行为差异。

Answer 1:

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

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

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



Answer 2:

尝试:

next(g)

看看这整齐表显示2和3之间的语法差异,当谈到这一点。



Answer 3:

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

import six

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


文章来源: Is generator.next() visible in python 3.0?