【发布时间】:2022-01-08 14:57:39
【问题描述】:
我无法理解为什么第三个next(w) 会执行,而StopIteration 异常会在下一个而不是第三个引发。
据我了解,next(w) 应该在其任何表达式用尽时引发StopIteration,并且只要next(y, 'b') 达到默认值'b' 就会发生。
为什么迭代器会两次返回默认值?
x = iter(range(3))
y = iter(range(3))
w = ([next(y, "a"), next(y, "b")] for z in x)
try:
print(next(w)) # -> prints [0, 1]
print(next(w)) # -> prints [2, 'b']
print(next(w)) # -> prints ['a', 'b']
print(next(w)) # raise StopIteration
print(next(w))
except:
print("7") # -> prints '7'
【问题讨论】:
-
我认为您的异常出现是因为您已经用尽了
w迭代器,而不是x或y迭代器(因为您没有w的默认值) -
你是什么意思“任何它的表达”?当您调用的迭代器决定这样做时,
next将引发StopIteration。在这种情况下,该迭代器是w,它是一个生成器表达式,它正在迭代x,它本身就是一个在大小为 3 的范围内的迭代器......所以毫不奇怪,打印了三件事