3

起初我写这个,它提出了 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,如何解释?

4

1 回答 1

3

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]

于 2018-03-06T07:48:44.700 回答