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