当生成器的生成值用完时会发生什么

  • 本文关键字: python generator yield-keyword
  • 更新时间 :
  • 英文 :


为了说明这个问题,假设我们有这个简单的生成器:

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)应该是相等的,对吗?

这并不神秘。当生成器用完可生成的值时,它会引发StopIteration异常。您只需要了解Python中的for循环是如何工作的。本质上,它相当于以下代码:

iterator = iter(collection)
while True:
    try:
        x = next(iterator)
        # do something
    except StopIteration as e:
        break

以上等价于:

for x in collection:
    # do something

相关内容

  • 没有找到相关文章

最新更新