我对所有有趣的迭代器都非常着迷itertools,但是我感到困惑的是这两个函数之间的区别以及为什么chain.from_iterable存在。
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))
两种功能有什么区别?
前者只能处理不可打包的迭代。后者可以处理无法完全解包的可迭代对象,例如无限生成器。
考虑
>>> 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是您的最佳选择。
from_iterable