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

def triangle_nums():
    '''Generates a series of triangle numbers'''
    tn = 0
    counter = 1
    while True:
        tn += counter
        yield tn
        counter += + 1

在Python 2中,我可以进行以下调用:
g = triangle_nums()  # get the generator
g.next()             # get the next value

但是在Python 3中,如果我执行相同的两行代码,则会出现以下错误:
AttributeError: 'generator' object has no attribute 'next'

但是,循环迭代器语法确实可以在Python 3中使用
for n in triangle_nums():
    if not exit_cond:
       do_something()...

我还没有找到任何可以解释Python 3行为差异的信息。

最佳答案

g.next()已重命名为g.__next__()。这样做的原因是一致性:__init__()__del__()之类的特殊方法都具有双下划线(在当前情况下为“dunder”),而.next()是该规则的少数异常(exception)之一。这已在Python 3.0中修复。 [*]

但是,请不要使用 g.__next__() 来调用next(g)

[*]还有其他特殊属性可以解决此问题; func_name,现在是__name__etc.

10-01 07:00
查看更多