在Python 3中generator.next()可见吗?

287 投票
3 回答
161684 浏览
提问于 2025-04-15 12:38

我有一个生成器,它可以生成一系列的东西,比如:

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中这种行为差异的资料。

3 个回答

12

如果你的代码需要在Python2和Python3两个版本下都能运行,可以使用一个叫做2to3的工具,配合一个名为six的库,像这样使用:

import six

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

试试这个:

next(g)

看看这个很棒的表格,它展示了在这方面,Python 2和Python 3语法的不同之处。

474

g.next() 这个方法现在改名为 g.__next__() 了。这样做的原因是为了保持一致性:像 __init__()__del__() 这样的特殊方法都有两个下划线(现在大家叫它“dunder”),而 .next() 是少数几个例外之一。这个问题在 Python 3.0 中得到了修复。[*]

不过,建议你不要直接调用 g.__next__(),而是使用 next(g) 这个方法。

[*] 还有其他一些特殊属性也进行了类似的修复,比如 func_name 现在变成了 __name__,还有 等等

撰写回答