四个鲜为人知的Python迭代过滤函数( 二 )

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 < stopstart + (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过滤函数的基础知识 。通过查看一些简单的示例,可以更好地理解这些函数的工作原理 。




推荐阅读