迭代器切片 islice

迭代器切片 islice

首页休闲益智标准切片手游更新时间:2024-04-26

学习《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