Python3 - 迭代器切片
2018-12-21 本文已影响17人
惑也
问题
你想得到一个由迭代器生成的切片对象,但是标准切片操作并不能做到。
解决方案
函数 itertools.islice()
正好适用于在迭代器和生成器上做切片操作。比如:
def count(n):
while True:
yield n
n += 1
c = count(0) # 从1位开始迭代
print(c[10:20])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable
import itertools
for x in itertools.islice(c, 10, 20):
print(x, end = ' ')
10 11 12 13 14 15 16 17 18 19
讨论
迭代器和生成器不能使用标准的切片操作,因为它们的长度事先我们并不知道,并且也没有实现索引。
函数 islice()
返回一个可以生成指定元素的迭代器,它通过遍历并丢弃,直到切片开始索引位置的所有元素。 然后才开始一个个的返回元素,直到切片结束索引位置。
需要强调的是 islice()
会消耗掉传入的迭代器中的数据。 迭代器是不可逆的,所以,如果之后再次访问这个迭代器的话,需要先将它里面的数据放入一个列表中。