上QQ阅读APP看书,第一时间看更新
4.1.5 迭代器切片
在Python中,很多对象都提供了标准的切片操作,如字符串、序列,但要得到一个由迭代器生成的切片对象,使用标准切片操作并不可行。对于迭代器,itertools模块中的islice()函数可以解决该切片操作问题。
函数itertools.islice()适用于在迭代器和生成器上做切片操作,代码(split_iter.py)示例如下:
def count(n): while True: yield n n += 1 c = count(0) print(c[5: 8]) import itertools for x in itertools.islice(c, 5, 8): print(f'iter val is: {x}')
执行py文件,输出结果如下:
Traceback (most recent call last): File "/advanced_programming/chapter4/split_iter.py", line 7, in <module> print(c[5: 8]) TypeError: 'generator' object is not subscriptable iter val is: 5 iter val is: 6 iter val is: 7
迭代器和生成器不能使用标准的切片操作,因为我们事先并不知道它们的长度(并且也没有实现索引)。函数islice()返回一个可以生成指定元素的迭代器,它通过遍历并丢弃切片索引开始位置的所有元素,然后返回元素,直到遍历至切片索引结束位置。
注意 islice()函数会消耗掉传入的迭代器中的数据,在使用时必须考虑到迭代器是不可逆的。如果需要之后再次访问迭代器,应先将迭代器中的数据放入一个列表中。