Python中的Map、Reduce和Filter函数式编程

21-09-13 banq

构成函数式编程范式核心的三个关键函数是 Map、Filter 和 Reduce。

 

Map

在 map 函数中,您作为参数传递的函数将应用于可迭代对象。

如果您熟悉列表推导式,Map 函数也有类似的效果。当我们需要同时在各种元素上映射或实现功能时,我们会使用它。

map 函数采用以下参数:

map(function, iterable object)

  • 函数function:可以是用户定义的函数或 lambda 函数。Lambda 是一个匿名函数,可以接受多个参数。它们只能有一种表达方式。
  • 可迭代对象 iterable object字符串、元组、列表、集合、字典等对象

假设我们有一个名为 FirstName 的列表,其中包含所有员工的名字,我们还有另一个列表,其中包含所有员工的姓氏。所需的输出是显示全名。您可以使用 for 循环来实现这一点,但这需要多行代码并且很乏味。Map 函数允许我们用一行代码来实现这一点。

first_name = ["Keith", "Elizabeth","Alex","William"] 
last_name = ["Philip","Brown","Smith","Oliver"]
name = list(map(lambda x, y:x+ " "+y, first_name, last_name))

再举一个例子,我们想找到一个所有数字的立方体。我们也可以通过传递一个函数作为参数来实现。

让我们首先创建一个函数,它返回一个输入的立方体

def cube(x):
    return x**3
arr_num = [1,3,5,7,9]
cube_values = list(map(cube, arr_num))
print(cube_values)

 

Filter

'Filter' 的行为类似于 map 函数,但还需要该函数查找条件,该条件是布尔值。然后过滤器从可迭代对象中返回满足条件的元素。本质上,它过滤掉不满足布尔逻辑的对象。

让我们看看如何使用过滤器函数来过滤名字以“h”结尾的员工

names = list(filter(lambda x: ( x[-1]=='h'),first_name))
print(names)

 

Reduce

'Reduce' 对可迭代对象启用成对操作。它使用传递函数中定义的每个操作的结果,以及每个连续元素。这会减少 pyton 将应用该函数的项目总数,直到只剩下一个最终值。

在我们查看reduce函数的参数之前,需要注意的是reduce必须从python的functools库中导入

这是导入的命令

from functools import reduce

我们有一个数字列表,我们想找到最大的数字。

arr_num = [110,569, 784, 377, 900, 126] 
large_num = reduce(lambda x, y: x if x>y else y, arr_num) 
print(largest_num)

源码

猜你喜欢