被generator.next()在Python 3.0可见?
-
21-08-2019 - |
题
我有产生一系列的发电机,例如:
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。
解决方案
正确,g.next()
已更名为g.__next__()
。这样做的原因是一致性:特殊的方法,如__init__()
和__del__
都有双下划线(或在当前白话“dunder”),并.next()
是为数不多的例外是规则之一。这被固定在Python 3.0。 [*]
但是,而不是调用g.__next__()
,如保罗说,使用next(g)
。
[*]有迹象表明,已经得到了此修复等特殊属性; func_name
,现已__name__
等
不隶属于 StackOverflow