Python3 使用 list(map(...)) 时无法引发 StopIteration 错误
Python3 StopIteration Error can not raise when using list(map(...))
起初我写这个,它引发了 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
在某个时刻迭代器引发 StopIteration
,所以 list
拦截它并结束列表(对于生成器没有其他方法可以做到这一点,例外是指示迭代已结束)
同于:
list(map(next,iter([])))
这里,异常是从下面的级别传播的。 map
没有提高它,但 next
是。对于捕获 StopIteration
异常的 list
构造函数,引发它的级别没有区别。
是的,你无法从 list
构造函数中让 StopIteration
"escape",但你可以通过列表理解来引发:
r = [next(it) for it in iters]
(因为 iters
是 StopIteration
而不是 map
,所以你发现 list(map(f,y))
与 [f(x) for x in y]
)
起初我写这个,它引发了 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
在某个时刻迭代器引发 StopIteration
,所以 list
拦截它并结束列表(对于生成器没有其他方法可以做到这一点,例外是指示迭代已结束)
同于:
list(map(next,iter([])))
这里,异常是从下面的级别传播的。 map
没有提高它,但 next
是。对于捕获 StopIteration
异常的 list
构造函数,引发它的级别没有区别。
是的,你无法从 list
构造函数中让 StopIteration
"escape",但你可以通过列表理解来引发:
r = [next(it) for it in iters]
(因为 iters
是 StopIteration
而不是 map
,所以你发现 list(map(f,y))
与 [f(x) for x in y]
)