在Python 3.0中可以看到generator.next()吗?

jot*_*tos 226 python iteration python-3.x

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

def triangleNums():
    '''generate series of triangle numbers'''
    tn = 0
    counter = 1
    while(True):
        tn = tn + counter
        yield tn
        counter = counter + 1
Run Code Online (Sandbox Code Playgroud)

在python 2.6中,我可以进行以下调用:

g = triangleNums() # get the generator
g.next()           # get next val
Run Code Online (Sandbox Code Playgroud)

但是在3.0中,如果我执行相同的两行代码,我会收到以下错误:

AttributeError: 'generator' object has no attribute 'next'
Run Code Online (Sandbox Code Playgroud)

但是,循环迭代器语法在3.0中有效

for n in triangleNums():
    if not exitCond:
       doSomething...
Run Code Online (Sandbox Code Playgroud)

我还没有能找到解释3.0行为差异的任何东西.

Len*_*bro 372

正确,g.next()已更名为g.__next__().这样做的原因是一致性:特殊方法__init__()__del__所有方法都有双重下划线(或当前白话中的"dunder"),并且.next()是该规则的少数例外之一.这已在Python 3.0中修复.[*]

但是g.__next__(),正如Paolo所说,而不是打电话next(g).

[*]还有其他特殊属性可以解决这个问题; func_name,现在__name__,等等


Pao*_*ino 133

尝试:

next(g)
Run Code Online (Sandbox Code Playgroud)

看看这个整洁的表格,它显示了2到3之间的语法差异.


dan*_*ius 10

如果您的代码必须在Python2和Python3下运行,请使用2to3 库,如下所示:

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
Run Code Online (Sandbox Code Playgroud)

  • 除非您需要支持2.6之前的Python版本,否则不需要这么做.Python 2.6和2.7具有`next`内置函数. (15认同)