Python中的map、reduce和filter函数是如何工作的?
在本文中,我们将为您展示 Python 的 map()、filter() 和 reduce() 函数如何将函数式编程与语言结合起来。这三个函数都是方便函数,可以用列表推导式或循环替换,但对某些问题提供了更优美和简洁的解决方案。
map()、filter() 和 reduce() 的使用方式相同。这些函数接受一个函数和一个元素序列,并返回将接收到的函数应用于序列中的每个元素的结果。
map() 函数
与 reduce() 一样, map() 函数允许您迭代遍历 iterable 中的每个项。但是 map() 独立于每个项操作,而不是产生单个结果。
最后, map() 函数可以用于对两个或多个列表执行数学运算。它甚至可以用于操作任何类型的数组。
map() 函数的时间复杂度 = O(n)
语法
map(function, iterable)
参数
- function − 代表要在代码中使用的函数。
-
iterable − 这是将在代码中迭代的值。
算法(步骤)
以下是要执行所需任务的算法/步骤。
- 创建一个名为 multiplyNumbers 的函数,用于返回传递给它的数字的乘法结果。
-
返回函数内给定的数字乘以3。
-
通过将函数名称和列表作为参数传递给它,使用 map() 函数对列表的每个元素应用 multiplyNumbers() 函数。
-
在将其与3相乘后,打印结果列表项。
代码
# 创建一个返回乘法结果的函数
def multiplyNumbers(givenNumbers):
# 将给定的数字乘以3,并返回
return givenNumbers*3
# 使用 map() 函数对每个列表元素应用 multiplyNumbers 函数
givenNumbers = map(multiplyNumbers, [1, 3, 5, 2, 6, 10])
# 打印乘以3的结果列表项
print("Multiplying list elements with 3:")
for element in givenNumbers:
print(element)
输出
执行上述程序将生成以下输出。
Multiplying list elements with 3:
3
9
15
6
18
30
filter() 函数
filter() 函数创建一个新迭代器,该迭代器可以从先前创建的迭代器(如列表、元组或字典)中筛选元素。
filter() 函数检查序列中是否存在给定条件,然后打印结果。
filter() 函数的时间复杂度 = O(n)
语法
filter(function, iterable)
参数
- function − 代表要在代码中使用的函数。
-
iterable − 这是将在代码中迭代的值。
算法(步骤)
以下是完成所需任务所需遵循的算法/步骤 –
- 创建名称为 votingAge 的函数,该函数返回列表中的投票资格年龄。
-
使用 if 条件语句来检查传递到函数中的数字是否大于或等于18岁。
-
如果上述语句为true,则返回该数字。
-
创建一个变量以存储输入列表。
-
使用 filter() 函数通过将函数名称和输入列表作为参数传递给它来过滤列表中大于或等于18岁的年龄。在此处,它将votingAge()函数应用于列表的每个元素,并且结果仅存储由votingAge()函数返回的列表的值(在此处,如果votingAge()函数返回的数字大于18,则适用于该数字)。
-
打印筛选器对象
-
使用 list() 函数(返回可迭代对象的列表)来将上述filter对象转换为列表并打印它。
例子
# 创建一个函数,该函数从列表中返回投票资格年龄。
def votingAge(givenNumumber):
# 检查数字是否大于或等于18岁
if givenNumumber>=18:
# 返回数字
return givenNumumber
# 输入列表
inputList = [3, 20, 18, 6, 14, 25, 19]
# 获取上述列表中大于或等于18岁的值
result_filterObj = filter(votingAge, inputList)
# 打印筛选器对象
print(result_filterObj)
# 转换为列表
print("输入列表中的投票资格年龄:", list(result_filterObj))
输出
在执行上述程序后,将生成以下输出 –
<filter object at 0x7fcd3ad14280>
输入列表中的投票资格年龄:[20, 18, 25, 19]
```
## reduce()
在Python中,reduce()函数通过遍历列表或其他可迭代数据类型中的每个项,返回一个单一的值。它位于functools库中。这比循环更有效率。 语法
```shell
reduce(function, iterable)
参数
- function - 在代码中要使用的函数。
-
iterable - 这是在代码中迭代的值。
算法(步骤)
以下是完成所需任务所需遵循的算法/步骤 –
- 使用import关键字从functools模块中导入 reduce() 函数。
-
创建名称为 addNumbers() 的函数,该函数返回所有列表项的总和。
-
创建一个变量以存储输入列表。
-
使用 reduce() 函数,通过传递 addNumbers() 函数和输入列表作为参数来获取所有列表项的总和。
例子
# 从functools模块导入reduce()方法
from functools import reduce
# 函数将返回列表中所有项的总和
def addNumbers(x, y):
return x+y
# 输入列表
inputList = [12, 4, 10, 15, 6, 5]
# 使用reduce()方法打印列表项的总和
print("所有列表项的总和:")
print(reduce(addNumbers, inputList))
输出
所有列表项的总和:
52
当我们将“addNumbers()”函数和输入列表作为reduce()方法的参数传递时,它将取两个元素的列表并将它们相加以创建一个元素,然后取另一个列表元素并再次相加以创建一个元素,依此类推,直到它将所有列表元素相加并返回一个单一的值。
结论
本文介绍了map()、reduce()和filter()函数及其语法和示例。