4.7 迭代器切片¶

问题¶

你想得到一个由迭代器生�的切片对象,但是标准切片�作并�能�到。

解决方案¶

函数 itertools.islice() 正好适用于在迭代器和生�器上�切片�作。比如:

>>> def count(n):
...     while True:
...         yield n
...         n += 1
...
>>> c = count(0)
>>> c[10:20]
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable

>>> # Now using islice()
>>> import itertools
>>> for x in itertools.islice(c, 10, 20):
...     print(x)
...
10
11
12
13
14
15
16
17
18
19
>>>

讨论¶

迭代器和生�器�能使用标准的切片�作,因为它们的长度事先我们并�知�(并且也没有实现索引)。 函数 islice() 返回一个�以生�指定元素的迭代器,它通过�历并丢弃直到切片开始索引�置的所有元素。 然��开始一个个的返回元素,并直到切片结�索引�置。

这里���强调的一点是 islice() 会消耗掉传入的迭代器中的数�。 必须考虑到迭代器是��逆的这个事实。 所以如果你需�之��次访问这个迭代器的�,那你就得先将它里�的数�放入一个列表中。