Python 当生成器的输出值不足时会发生什么情况?

Python 当生成器的输出值不足时会发生什么情况?,python,generator,yield-keyword,Python,Generator,Yield Keyword,为了说明这个问题,假设我们有一个简单的生成器: def firstn(n): num = 0 while num < n: yield num num += 1 for i in firstn(10): print i 这支持了我的理论。我的大问题是:StopIteration是如何工作的,这是否意味着用大值调用生成器可以等同于用最小的终止值调用它?在我们的示例中,firstn(5)中i的和firstn(999999999999)

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

def firstn(n):
    num = 0
    while num < n:
        yield num
        num += 1

for i in firstn(10):
    print i

这支持了我的理论。我的大问题是:
StopIteration
是如何工作的,这是否意味着用大值调用生成器可以等同于用最小的终止值调用它?在我们的示例中,firstn(5)中i的
和firstn(999999999999)中i的
应该是等价的,对吧?

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

iterator = iter(collection)
while True:
    try:
        x = next(iterator)
        # do something
    except StopIteration as e:
        break
上述内容相当于:

for x in collection:
    # do something

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

iterator = iter(collection)
while True:
    try:
        x = next(iterator)
        # do something
    except StopIteration as e:
        break
上述内容相当于:

for x in collection:
    # do something

您知道
num<5
只表示
num<5和5
,对吗?对于第二种情况,是的。不管你传入什么,只要它大于5,它就会返回1..4。一旦生成器的值用完,它就会引发一个
StopIteration
异常,告诉调用方它的数据用完了。您知道
num<5
只意味着
num<5和5
,对吗?对于第二种情况,是的。不管你传入什么,只要它大于5,它就会返回1..4。一旦生成器的值用完,它将引发一个
StopIteration
异常,该异常告诉调用方它的数据用完了。酷。我不知道for循环使用了
StopIteration
来中断。谢谢。@Newb不要上当,不过,这只是等效的Python。在幕后,它是一个更加优化的C实现(在CPython中)。酷。我不知道for循环使用了
StopIteration
来中断。谢谢。@Newb不要上当,不过,这只是等效的Python。在后台,它是一个更加优化的C实现(在CPython中)。