来自itertools库的tee函数

Joh*_*ohn 5 python python-itertools

list和islice对象都是可迭代的,但为什么会产生这种差异.

r = [1, 2, 3, 4]               
i1, i2 = tee(r)
print [e for e in r if e < 3]
print [e for e in i2]
#[1, 2]
#[1, 2, 3, 4]


r = islice(count(), 1, 5)          
i1, i2 = tee(r)
print [e for e in r if e < 3]
print [e for e in i2]
#[1, 2]
#[]
Run Code Online (Sandbox Code Playgroud)

Gar*_*tty 14

这里的问题是tee()需要使用原始迭代器中的值,如果从原始迭代器开始使用它们,它将无法正常运行.在列表示例中,迭代再次开始.在生成器示例中,它已耗尽,不再生成任何值.

这有很好的记录:

一旦tee()进行了拆分,原始的iteable不应该在其他任何地方使用; 否则,迭代可以在没有通知tee对象的情况下进行.

资源

编辑以说明列表和生成器之间的差异点:

>>> from itertools import islice, count
>>> a = list(range(5))
>>> b = islice(count(), 0, 5)
>>> a
[0, 1, 2, 3, 4]
>>> b
<itertools.islice object at 0x7fabc95d0fc8>
>>> for item in a:
...     print(item)
... 
0
1
2
3
4
>>> for item in a:
...     print(item)
... 
0
1
2
3
4
>>> for item in b:
...     print(item)
... 
0
1
2
3
4
>>> for item in b:
...     print(item)
... 
>>> 
Run Code Online (Sandbox Code Playgroud)