为了说明这个问题,假设我们有这个简单的生成器:
def firstn(n):
num = 0
while num < n:
yield num
num += 1
for i in firstn(10):
print i
这将打印数字 0 到 9。但是如果我们有:
def firstn(n):
num = 0
while num < 5 < n:
yield num
num += 1
for i in firstn(10):
print i
(更改在while
语句中。)然后它只打印数字 0 到 4。一旦num >= 5
,则生成器不再产生值。
我很好奇的是幕后发生了什么:我使用PythonTutor 单步执行代码,我的印象是一旦while
语句不再是True
,函数隐式返回None
,for
循环以某种方式检测到,然后也休息。我使用next
内置来更仔细地检查它:
>>> def firstn(n):
... num = 0
... while num < 5 < n:
... yield num
... num += 1
...
>>>
>>> mygen = firstn(100)
>>> next(mygen)
0
>>> next(mygen)
1
>>> next(mygen)
2
>>> next(mygen)
3
>>> next(mygen)
4
>>> next(mygen)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
这支持了我的理论。我的大问题:它是如何StopIteration
工作的,这是否意味着调用具有大值的生成器可以等效于使用其最小终止值调用它?在我们的例子中,for i in firstn(5)
应该for i in firstn(9999999999999)
是等价的,对吧?