itertools中的chain和chain.from_iterable有什么区别?

我在互联网上找不到任何有效的例子,我可以看到他们之间的差异,以及为什么select一个。

第一个参数是0或更多的参数,每个参数都是可迭代的,第二个参数需要一个参数,这个参数可以产生迭代次数:

itertools.chain(list1, list2, list3) iterables = [list1, list2, list3] itertools.chain.from_iterable(iterables) 

iterables可以是任何产生迭代的迭代器。

 def generate_iterables(): for i in range(10): yield range(i) itertools.chain.from_iterable(generate_iterables()) 

使用第二种forms通常是一个方便的例子,但是由于它懒惰地循环input迭代,所以它也是链接无限数量的有限迭代器的唯一方法:

 def generate_iterables(): while True: for i in range(5, 10): yield range(i) itertools.chain.from_iterable(generate_iterables()) 

上面的例子会给你一个迭代,它产生一个永不停止的循环数字模式,但是永远不会消耗比单个range()调用所需要的更多的内存。

他们做的事情非常相似。 对于less量的迭代itertools.chain(*iterables)itertools.chain.from_iterable(iterables)执行类似。

from_iterables的关键优势在于能够处理大量的(可能无限的)迭代次数,因为在调用的时候,所有这些迭代器都不需要可用。