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中)。