一尘不染

chain(* iterable)与chain.from_iterable(iterable)之间的区别

python

我对所有有趣的迭代器都非常着迷itertools,但是我感到困惑的是这两个函数之间的区别以及为什么chain.from_iterable存在。

from itertools import chain

def foo(n):
    for i in range(n):
        yield [i, i**2]

chain(*foo(5))

chain.from_iterable(foo(5))

两种功能有什么区别?


阅读 197

收藏
2021-01-20

共1个答案

一尘不染

前者只能处理不可打包的迭代。后者可以处理无法完全解包的可迭代对象,例如无限生成器。

考虑

>>> from itertools import chain
>>> def inf():
...     i=0
...     while True:
...         i += 1
...         yield (i, i)
... 
>>> x=inf()
>>> y=chain.from_iterable(x)
>>> z=chain(*x)
<hangs forever>

此外,仅拆箱操作是一项急切的,前期成本高的活动,因此,如果您的迭代有效果,则希望懒惰地进行评估,这from_iterable是您的最佳选择。

2021-01-20