Python进阶编程:编写更高效、优雅的Python代码
上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()函数会消耗掉传入的迭代器中的数据,在使用时必须考虑到迭代器是不可逆的。如果需要之后再次访问迭代器,应先将迭代器中的数据放入一个列表中。