False
之前不返回任何元素 。一旦谓词返回False
,迭代器就会返回序列中的所有后续元素 。
对于长度为n的序列,如果谓词函数第一次返回False
的元素是seq[k]
,那么迭代器会返回seq[k]
、seq[k+1]
、…、seq[n-1]
。
接下来使用相同的序列和谓词函数:
from itertools import dropwhiledef is_less_than_5(n): return n < 5nums = [1, 3, 5, 2, 4, 6]filtered_nums_2 = dropwhile(is_less_than_5, nums)print(list(filtered_nums_2))
由于谓词函数is_less_than_5
第一次返回False
是在元素5上 , 因此本文得到从5开始的序列中的所有元素:
Output >>> [5, 2, 4, 6]
4. islice你可能已经熟悉了对Python可迭代对象(如列表、元组和字符串)进行切片操作 。切片的语法是:iterable[start:stop:step]
。
然而,这种切片操作具有以下缺点:
- 在处理大型序列时,每个切片或子序列都是一个占用内存的副本,这可能会降低效率 。
- 【四个鲜为人知的Python迭代过滤函数】由于步长也可以取负值,使用起始、停止和步长值会影响可读性 。
islice
函数解决了上述限制:- 它返回一个迭代器 。
- 它不允许步长取负值 。
islice
函数:from itertools import isliceislice(seq,start,stop,step)
下面是使用islice
函数的几种不同方式:- 使用
islice(seq, stop)
函数返回一个迭代器 , 该迭代器遍历切片seq[0]
、seq[1]
、...、seq[stop - 1]
。
- 如果指定了起始和停止值:
islice(seq, start, stop)
,该函数会返回一个迭代器 , 该迭代器遍历切片seq[start]
、seq[start + 1]
、...、seq[start + stop - 1]
。
- 当指定起始、停止和步长参数时,该函数返回一个迭代器 , 该迭代器遍历切片
seq[start]
、seq[start + step]
、seq[start + 2*step]
、...、seq[start + k*step]
,其中start + k*step < stop
且start + (k+1)*step >= stop
。
nums = list(range(10)) #[0,1, 2, 3, 4, 5, 6, 7, 8, 9]
现在,跟随本文使用已学过的islice
函数的语法 。仅使用停止值这里本文只指定停止索引:
from itertools import islice# 仅指定停止索引sliced_nums = islice(nums, 5)print(list(sliced_nums))
以下是输出结果:Output >>> [0, 1, 2, 3, 4]
使用起始和停止值在这里 , 本文同时使用起始值和停止值:# 指定起始和停止索引sliced_nums = islice(nums, 2, 7)print(list(sliced_nums))
切片从索引2开始,一直延伸到索引7但不包括索引7:Output >>> [2, 3, 4, 5, 6]
使用起始、停止和步长值当本文使用起始、停止和步长值时:# 使用起始、停止和步长sliced_nums = islice(nums, 2, 8, 2)print(list(sliced_nums))
得到一个从索引2开始、一直延伸到索引8但不包括索引8的切片,步长为2(每隔一个元素返回一次)) 。Output >>> [2, 4, 6]
总结希望本教程能帮助你理解itertools
过滤函数的基础知识 。通过查看一些简单的示例,可以更好地理解这些函数的工作原理 。推荐阅读
- 五个帮助初学者提高编码技术的简单方法
- AI绘画 | 纯净美丽的白色薄纱少女
- “维护者都快累死了!”Linux 宣布:LTS 版本的维护期,将从 6 年变回 2 年
- 深度学习的关键特征是什么
- 解决梯度消失问题的神经网络结构及其广泛应用
- AI绘画 | 黑发及腰的魅力少女
- 深度网络的退化问题
- 数字人点燃杭州亚运会主火炬!亚运史首个!到底是如何实现的?
- 六个Spring Boot处理异常的小技巧
- C++11中auto关键字的深入理解与应用