我们知道不能直接对生成器或迭代器切片:

aiter = (x for x in range(5))
print(aiter[0:3])

输出:

TypeError: 'generator' object is not subscriptable

好在Python内置的itertools库通过了islice()方法用于迭代器的切片,基本语法如下:

islice(iterable, stop) --> islice object
islice(iterable, start, stop[, step]) --> islice object

只传入一个值时默认是从开头到该下标前为止:

import itertools

aiter = (x for x in range(5))
print(list(itertools.islice(aiter, 3)))

输出:

[0, 1, 2]

如果想完整地切片则可以写None(迭代器不能用len取长度):

import itertools

aiter = (x for x in range(5))
print(list(itertools.islice(aiter, None)))

输出:

[0, 1, 2, 3, 4]

传入3个参数可以像普通切片一样指定起始、结束和步长,其中步长是可选参数:

import itertools

aiter = (x for x in range(5))
print(list(itertools.islice(aiter, 1, 4, 2)))

输出:

[1, 3]

迭代器切片后就相当于被用过了,因此next会从切片之后的元素开始返回(即使切片之前还有元素也不要了):

import itertools

aiter = (x for x in range(5))
print(list(itertools.islice(aiter, 1, 3)))
print(next(aiter))

输出:

[1, 2]
3

即使切片之前还有一个0,也取不到了,毕竟迭代器是单向的。

和普通切片一样,islice是浅拷贝:

import itertools

values = [1, 2, [1, 2]]
new = list(itertools.islice(values, None))
values[-1][0] = 3
print(new)

输出:

[1, 2, [3, 2]]
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐