推荐:使用 NSDT场景编辑器 快速搭建3D应用场景
当您只想循环遍历迭代器、检索序列中的元素并处理它们时,这些元素特别有用 - 所有这些都无需将它们存储在内存中。今天我们将学习如何使用以下四个迭代工具过滤器函数:
让我们开始吧!
在本教程中:
list()
如果你已经用Python编程了一段时间,你可能会使用内置函数和语法:filter
- filter(pred,seq)
- # pred: predicate function
- # seq: any valid Python iterable
该函数提供了一个迭代器,该迭代器从谓词返回的序列中返回元素。filter
True
让我们举个例子:
- nums = list(range(1,11)) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-
- def is_even(n):
- return n % 2 == 0
在这里,列表和函数分别是序列和谓词。nums
is_even
为了获取 中所有偶数的列表,我们使用如下所示的:nums
filter
- nums_even = filter(is_even, nums)
- print(list(nums_even))
Output >>> [2, 4, 6, 8, 10]
现在让我们了解.我们将从 itertools 模块导入函数(以及我们将讨论的所有其他函数)。filterfalse
filterfalse
顾名思义,与函数的作用相反。它提供了一个迭代器,该迭代器返回谓词返回的元素。以下是使用该函数的语法:filterfalse
filter
False
filterfalse
- from itertools import filterfalse
- filterfalse(pred,seq)
该函数返回 中的所有奇数。因此,使用获得的列表是以下所有奇数的列表:is_even
False
nums
nums_odd
filterfalse
nums
- from itertools import filterfalse
-
- nums_odd = filterfalse(is_even, nums)
- print(list(nums_odd))
Output >>> [1, 3, 5, 7, 9]
使用该函数的语法为:takewhile
- from itertools import takewhile
- takewhile(pred,seq)
该函数给出一个迭代器,只要谓词函数返回 .当谓词首次返回时,它将停止返回元素。takewhile
True
False
对于 n 长度序列,if 是谓词函数返回的第一个元素,则迭代器返回 ,..., .seq[k]
False
seq[0]
seq[1]
seq[k-1]
考虑以下列表和谓词函数。我们使用如下所示的函数:nums
is_less_ than_5
takewhile
- from itertools import takewhile
-
- def is_less_than_5(n):
- return n < 5
-
- nums = [1, 3, 5, 2, 4, 6]
- filtered_nums_1 = takewhile(is_less_than_5, nums)
- print(list(filtered_nums_1))
在这里,谓词首次返回数字 5:is_less_than_5
False
Output >>> [1, 3]
在功能上,函数执行与函数相反的操作。dropwhile
takewhile
以下是使用该函数的方法:dropwhile
- from itertools import dropwhile
- dropwhile(pred,seq)
该函数提供了一个不断丢弃元素的迭代器,只要谓词是 .这意味着迭代器在谓词第一次返回之前不会返回任何内容。一旦谓词返回,迭代器返回序列中的所有后续元素。dropwhile
True
False
False
对于 n 长度序列,if 是谓词函数返回的第一个元素,则迭代器返回 ,..., .seq[k]
False
seq[k]
seq[k+1]
seq[n-1]
让我们使用相同的序列和谓词:
- from itertools import dropwhile
-
- def is_less_than_5(n):
- return n < 5
-
- nums = [1, 3, 5, 2, 4, 6]
- filtered_nums_2 = dropwhile(is_less_than_5, nums)
- print(list(filtered_nums_2))
因为谓词函数第一次返回元素 5,所以我们得到从 5 开始的序列的所有元素:is_less_than_5
False
Output >>> [5, 2, 4, 6]
您已经熟悉对 Python 可迭代对象(如列表、元组和字符串)进行切片。切片采用语法:。iterable[start:stop:step]
但是,这种切片方法具有以下缺点:
该函数解决了上述限制:islice
您可以像这样使用该函数:islice
- from itertools import islice
- islice(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
-
- # only stop
- sliced_nums = islice(nums, 5)
- print(list(sliced_nums))
这是输出:
Output >>> [0, 1, 2, 3, 4]
在这里,我们同时使用开始值和停止值:
- # start and stop
- sliced_nums = islice(nums, 2, 7)
- print(list(sliced_nums))
切片从索引 2 开始,一直延伸到但不包括索引 7:
Output >>> [2, 3, 4, 5, 6]
当我们使用开始值、停止值和步长值时:
- # using start, stop, and step
- sliced_nums = islice(nums, 2, 8, 2)
- print(list(sliced_nums))
我们得到一个从索引 2 开始的切片,一直延伸到但不包括索引 8,步长为 2(每隔一个元素返回一次)。
Output >>> [2, 4, 6]
我希望本教程能帮助您了解迭代工具过滤器函数的基础知识。您已经看到了一些简单的示例,以更好地理解这些函数的工作原理。接下来,您可以了解生成器生成器函数和生成器表达式如何作为高效的 python 迭代器工作。