学习《Python Cookbook》第三版
想得到一个由迭代器生成的切片对象,但是标准切片操作并不能做到
函数 itertools.islice() 适用于在迭代器和生成器上做切片操作。比如:
def dog(num):
while True:
yield num
num = 1
for item in islice(dog(2), 2, 5):
print(item)
"""
4
5
6
"""
dog_num = dog(3)
# print(dog_num[2:5]) # 报错 TypeError: 'generator' object is not subscriptable 生成器
迭代器和生成器不能使用标准的切片操作,因为它们的长度事先我们并不知道 (并且也没有实现索引)。函数 islice() 返回一个可以生成指定元素的迭代器,它通过遍历并丢弃直到切片开始索引位置的所有元素。然后才开始一个个地返回元素,并直到切片结束索引位置。
这里要着重强调的一点是 islice() 会消耗掉传入的迭代器中的数据。必须考虑到迭代器是不可逆的这个事实。所以如果你需要之后再次访问这个迭代器的话,那你就得先将它里面的数据放入一个列表中。
islice大致相当于以下代码:
def own_islice(iterable, *args):
# islice('ABCDEFG', 2) --> A B
# islice('ABCDEFG', 2, 4) --> C D
# islice('ABCDEFG', 2, None) --> C D E F G
# islice('ABCDEFG', 0, None, 2) --> A C E G
s = slice(*args)
start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1
it = iter(range(start, stop, step))
try:
nexti = next(it)
except StopIteration:
# Consume iterable 的元素直到 start
for i, element in zip(range(start), iterable):
pass
return
try:
for i, element in enumerate(iterable):
if i == nexti:
yield element
nexti = next(it)
except StopIteration:
# 耗尽stop
for i, element in zip(range(i 1, stop), iterable):
pass
def dog(num):
while True:
yield num
num = 1
for item in own_islice(dog(2), 2, 5):
print(item)
"""
4
5
6
"""
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved