起初我写这个,它提出了 StopIteration,效果很好。
it = iter([1])
iters = [it] * 2
for it in iters:
r = next(it)
print(r)
但是当我改为这个时:
it = iter([1])
iters = [it] * 2
r = list(map(next, iters))
print(r)
它不能引发 StopIteration,如何解释?
起初我写这个,它提出了 StopIteration,效果很好。
it = iter([1])
iters = [it] * 2
for it in iters:
r = next(it)
print(r)
但是当我改为这个时:
it = iter([1])
iters = [it] * 2
r = list(map(next, iters))
print(r)
它不能引发 StopIteration,如何解释?
list
构造函数检测到参数是可迭代的,所以它有点像这样迭代它(我正在编造这个):
def __init__(self,iterable):
# some init stuff to create the list
while True:
try:
next_element = next(iterable)
self.append(next_element)
except StopIteration:
break
在某些时候,iterable raises StopIteration
,所以list
拦截它并结束列表(它没有其他方法可以使用生成器,例外是指示迭代已经结束的信号)
如同:
list(map(next,iter([])))
在这里,异常是从下面的级别传播的。map
不是提高它,而是提高它next
。对于list
捕获异常的构造函数,StopIteration
提升它的级别没有区别。
是的,你无法让构造函数StopIteration
“逃脱” list
,但你可以通过列表理解来提升它:
r = [next(it) for it in iters]
(因为iters
是被监视的StopIteration
,不是map
,所以你发现了一个list(map(f,y))
不一样的情况[f(x) for x in y]
)