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)