Python 中 Map、Filter 和 Reduce 函数的简明解析

图片[1]-Python 中 Map、Filter 和 Reduce 函数的简明解析-山海云端论坛

01

引言

本文重点介绍 Python 中的三个特殊函数:Map、Filter 和 Reduce,以及如何使用它们进行代码编程。在开始介绍之前,我们先来理解两个简单的概念:高阶函数和 Lambda 函数。

闲话少说,我们直接开始吧!

02

高阶函数

将函数作为参数传入的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。举例如下:

<code>def higher(your_function, some_variable): return your_function(some_variable)</code>

实质上,函数 map、filter 和 reduce 均为高阶函数,它们的输入参数为函数和可迭代对象(list、tuple 等),具体形式如下:

<code>map(your_function, your_list) filter(your_function, your_list) reduce(your_function, your_list)</code>

03

Lambda 表达式

Lambda 函数类似于普通的 Python 函数,区别在于我们必须为普通函数命名,但对于 lambda 函数,命名是可选的。具体语法如下:

<code>lambda inputs: output</code>

接下来,让我们看一下几个普通函数及其 lambda 函数等效实现,如下:

<code>def multiply2(x): # is the same as return x * 2 multiply2 = lambda x: x * 2 # lambda function</code>

另一个例子如下:

<code>def add(a, b): # is the same as return a + b add = lambda a, b: a + b # lambda function</code>

04

Map 函数

函数 map 用于迭代可迭代对象中的每个元素进行相应的转换操作。

例如,通过将 [1,2,3] 中的每个元素乘以 2,将 [1,2,3] 变换为 [2,4,6]。

为此,我们需要一个 lambda 函数,该函数用于实现将单个元素乘 2 的操作,如下:

<code>before = [1, 2, 3] after = list(map(lambda x: x * 2, before)) # after is [2, 4, 6]</code>

此外,我们再看下个示例,主要用于将字符串所有字符转换为大写形式。如下:

<code>before = ["apple", "orange", "pear"] after = list(map(lambda x: x.upper(), before)) # after is ["APPLE", "ORANGE", "PEAR"]</code>

需要注意的是,虽然上述 lambda 函数中使用变量 x,但只要它是有效的变量名称,我们可以更换为任何我们想要取的变量名称。

05

Filter 函数

函数 filter 主要功能为根据特定过滤条件从可迭代对象中选择相应的元素。举例,对于列表 [1,2,3,4,5,6],如果我们想要过滤得到其中的奇数元素。我们可以实现一个 lambda 函数,当参数为奇数时为 True,否则为 False。

代码如下:

<code>before = [1, 2, 3, 4, 5, 6] after = list(filter(lambda x: x % 2 == 1, before)) # after is [1, 3, 5]</code>

再举个例子,实现只保留字符串长度大于等于 5 的,即将列表 [“apple”, “orange”, “pear”] 转换为 [“apple”, “orange”]。此时我们可以实现一个 lambda 函数,接收一个字符串,如果该字符串的长度大于等于 5,则返回 True,否则为 False。

代码如下:

<code>before = ["apple", "orange", "pear"] after = list(filter(lambda x: len(x) >= 5, before)) # after is ["apple", "orange"]</code>

06

Reduce 函数

函数 reduce 主要用于以某种方式来组合可迭代对象中的所有元素。与函数 map 和 filter 不同,我们需要单独引入 reduce,如下所示:

<code>from functools import reduce</code>

此外,reduce 中使用的 lambda 函数需要两个参数,它主要用于告诉我们如何将两个元素组合成起来。

举个例子,假如我们需要将列表 [1,2,3,4,5] 中的所有元素进行相乘得到数字 120,这里我们需要实现的 lambda 函数就是接收两个数字,并将它们相乘。

代码示例如下:

<code>from functools import reduce before = [1, 2, 3, 4, 5] after = reduce(lambda a, b: a * b, before) # after is 120</code>

另外一个例子,如果我们需要使用 “-” 来将字符串连接起来。具体为将列表 [“apple”, “orange”, “pear”] 变成 “apple-orange-pear” 。这里,我们需要实现一个 lambda 函数,它接受 2 个字符串,并将它们用一个 “-” 字符相加。

代码实现如下:

<code>from functools import reduce before = ["apple", "orange", "pear"] after = reduce(lambda a, b: a + "-" + b, before)</code>

07

总结

本文从高级函数和 Lambda 函数入手,先后介绍了 Map、Filter 和 Reduce 三个高级函数的用法,并给出了相应的代码示例。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容