Python的Lambda、Map、Filter和Reduce详解

源节点: 1172017

这篇文章是作为 数据科学博客马拉松

介绍

大家好。 你有没有对 Python 的 Lambda、Map、Filter 和 Reduce 感到困惑? 嗯? 不用担心,我已经为您准备好了。 在本文中,我们将消除您可能遇到的所有困惑。 具体来说,阅读本文后,您将了解:

  • 什么是 是 Lambda、Map、Filter 和 Reduce?
  • 为什么 我们使用 Lambda、Map、Filter 和 Reduce 吗?
  • 创新中心 使用 Lambda、Map、Filter 和 Reduce?
  • 什么时候 使用 Lambda、Map、Filter 和 Reduce?

如果您对此主题没有任何困惑,您可以直接进入“摘要”部分。

目录

  1. LAMBDA
  2. 地图位置
  3. 筛选器
  4. 减少
  5. 总结
  6. 尾注

LAMBDA

Lambda 是 Python 中用于定义函数的关键字,更具体地说是匿名函数,此类函数称为 Lambda 函数或 Lambda 表达式。

下面是定义 Lambda 函数的语法。

lambda 参数:表达式

让我们通过一个例子来理解这一点。

如果我让你写一个函数来计算一个数的平方怎么办? 您可能会编写如下内容:

def square(n): 返回 n ** 2

上面显示的代码是不言自明的,不是 Pythonic 的。 我们有 lambda 函数使它成为 Pythonic。 以下是使用 lambda 的平方等效函数:

平方 = lambda n: n ** 2

表达方式 n ** 2 首先进行评估,然后将值返回给标识符 广场. 标识符 广场 现在可以充当一个函数,因此我们可以传递任何数字作为参数来求一个数的平方。

# 调用 lambda 函数 square(5)
# 输出:25

我们还可以通过添加条件语句来扩展 lambda 函数。 请参阅以下不言自明的示例。

maxi = lambda x, y: x 如果 x > y 否则 y maxi(4, 6)
# 输出:6

所以,这是关于使用 lambda 使你的代码成为 Pythonic。 但这并不是 lambda 所做的全部。 它还经常用于创建函数包装器,例如 Python 的装饰器. 以下是一个这样的例子。

def transform(n): return lambda x: x + n f = transform(3) f(4) # 输出:7 (3 + 4)

改造 函数接受一个数字并返回 lambda 表达式/函数。 Lambda 函数进一步添加两个数字, xn.

Lambda 函数的局限性在于它们可以有任意数量的参数,但是 只有一种表达.

Lambda 函数主要与映射函数一起用作就地函数。 那么,让我们讨论地图功能。

地图位置

如果我让你找到前五个奇数的平方怎么办? 您可能会编写如下内容:

squares = [] for n in range(1, 10, 2): squares.append(n ** 2)

循环从 1 到 10 迭代,步长为 2,并将每个数字的平方附加到 广场. 上面显示的方法可以使用列表理解来改进,但也将使用 for 循环。 所以,有一个 在不使用显式 for 循环的情况下执行相同操作的方法。 Python 的 map 函数就是这样做的。 它根据给定条件转换给定的可迭代对象。

映射函数的语法如下:

映射(函数,可迭代)

地图功能接受一个 功能可迭代的(列表、元组等)作为输入; 将传递的函数应用于可迭代的每个项目并返回一个映射对象(迭代器)。

让我们使用 map 函数重新实现上面的示例。

def square(n): return n ** 2 squares = map(square, range(1, 10, 2)) squares # 返回地图对象 list(squares) # 输出:[1, 9, 25, 49, 81]

广场 函数返回任意数的平方。 这 地图 功能接受 广场 功能和 范围(1、10、2) 作为参数。 它适用于 广场 给定范围(1、3、5、7 和 9)上的函数返回一个地图对象,然后转换为列表。

上面的代码比前面的代码长。 因此,让我们使用 lambda 函数使其成为 pythonic。 看看下面的自解释代码。

方块 = 列表(地图(lambda n: n ** 2, 范围(1, 10, 2)))

在这里,lambda 函数应用于给定的可迭代对象,该可迭代对象返回一个映射对象,然后转换为列表。

map 函数可以有多个可迭代对象。 让我们举一个简单的例子来证明这一点。

num1 = [2, 4, 9] num2 = [3, 8, 5] result = list(map(lambda x, y: x + y, num1, num2)) result # 输出:[5, 12, 14]

在这里,我们执行了列表的逐元素添加。

请记住,地图可以将任何可迭代对象作为参数,而不仅仅是一个列表。

筛选器

假设您想从给定列表中找到奇数。 解决此问题的一种快速方法是在列表理解中使用 for 循环。

nums = [1, 34, 23, 56, 89, 44, 92] odd_nums = [num for num in nums if num % 2 != 0]

循环遍历 NUMS 并存储每个奇数。 这里的条件语句 过滤器 出偶数并仅返回奇数。 这种功能称为过滤。

Python 的过滤器以更快的方式完成同样的工作。 它具有与地图相同的语法。

过滤器(函数,可迭代)

它的工作原理与地图类似。 与地图对象不同,它返回一个过滤器对象。

让我们使用 filter 函数重新实现上面的例子。

def find_odd(x): if x % 2 != 0: return x nums = [1, 34, 23, 56, 89, 44, 92] odds = list(filter(find_odd, nums)) print(odds) # 输出: [1, 23, 89]

让我们转换这个 查找奇数 将函数转换为 lambda 函数并重写代码以使其更短。

nums = [1, 34, 23, 56, 89, 44, 92] odds = list(filter(lambda x: x % 2 != 0, nums)) print(odds) # 输出:[1, 23, 89]

lambda 函数计算结果为 true 的可迭代项的所有项都将添加到 奇怪的。

减少

假设您要计算前五个整数的总和。 您可以编写如下内容:

nums = [1, 2, 3, 4, 5] summ = 0 for num in nums: summ += num summ # 输出:15

循环遍历 NUMS 并不断将所有数字添加到 求和。 再次让它成为 pythonic,我们有一个函数,即 Reduce。

reduce 的语法如下:

减少(函数,可迭代的,[,初始值设定项])

减少适用于 功能 累积地 在一个的所有项目上 可迭代的 并返回单个值。 如果您还没有得到它,请不要担心。

让我们用 reduce 函数重新实现上面的例子。

from functools import reduce nums = [1, 2, 3, 4, 5] summ = reduce(lambda x, y: x + y, nums) summ # 输出:15

请参考下图了解幕后发生的事情。

Python 减少 | Lambda 映射过滤器减少

图片来源:作者

此处,总和以累积/连续的方式执行:((((1 + 2) + 3) + 4) + 5)。

总结

LAMBDA

  • 具有许多参数但只有一个表达式的函数。
  • 它有助于使我们的代码成为 pythonic 并创建函数包装器。

地图位置

  • 将给定函数应用于可迭代对象的每个项目并返回迭代器的函数。
  • 它提供了一个 根据给定条件转换可迭代对象的方法。
  • 它可以有多个迭代器。

筛选器

  • 它具有与 map 函数相同的语法。
  • 它有助于根据给定条件从可迭代对象中提取项目。

减少

  • 它应用一个函数 累积地/相继地 在可迭代的每个项目上并返回单个值。

尾注

今天的讨论到此结束。 感谢您阅读本文! 我希望你喜欢这篇文章,并且像我写这篇文章时一样享受阅读它的乐趣🙂

我是否错过了重要的事情或想分享您的想法? 在下方发表评论,我会尽快回复您。

关于作者

我是 Harsh Dhamecha,人工智能专业最后一年的本科生,机器学习导师和有抱负的数据科学家。 我撰写有关 Python、机器学习和深度学习的文章。

如有任何疑问,可直接 邮箱地址 我,太无聊了吧? 我们有 LinkedInTwitter. 我经常在 Python、机器学习、深度学习和数据科学上写线程 Twitter. 关注我以保持更新!

你可以看看 其他文章 我已经写了。

还在看这篇文章吗? 特别感谢你🙌

本文中显示的媒体不归 Analytics Vidhya 所有,由作者自行决定使用。

来源:https://www.analyticsvidhya.com/blog/2021/10/an-explanation-to-pythons-lambda-map-filter-and-reduce/

时间戳记:

更多来自 分析维迪亚