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

发布于 2021-01-29 14:58:39

我对所有有趣的迭代器都非常着迷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))

两种功能有什么区别?

关注者
0
被浏览
119
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    考虑

    >>> 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是您的最佳选择。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看