修改为更准确的描述

itertools.chain(*files)导致gen_opener()生成器被提前全部消费掉,因此在此场景不适合,参见原文https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch04s13.html。但仍可以用yield from itertools.chain.from_iterable(files),itertools.chain.from_iterable相对于itertools.chain,它是懒消费的。
见https://stackoverflow.com/questions/15004772/what-is-the-difference-between-chain-and-chain-from-iterable-in-itertools
This commit is contained in:
jeremyxu2010
2017-10-04 15:52:04 +08:00
committed by GitHub
parent f53ef079be
commit 34be2eae1a

View File

@@ -131,7 +131,7 @@
这个函数的目的是将输入序列拼接成一个很长的行序列。
``itertools.chain()`` 函数同样有类似的功能,但是它需要将所有可迭代对象最为参数传入。
在上面这个例子中,你可能会写类似这样的语句 ``lines = itertools.chain(*files)``
使得 ``gen_opener()`` 生成器被全部消费掉。
这将导致 ``gen_opener()`` 生成器被提前全部消费掉。
但由于 ``gen_opener()`` 生成器每次生成一个打开过的文件,
等到下一个迭代步骤时文件就关闭了,因此 ``chain()`` 在这里不能这样使用。
上面的方案可以避免这种情况。