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__,等等
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)
| 归档时间: |
|
| 查看次数: |
106017 次 |
| 最近记录: |