这篇文章是作为 数据科学博客马拉松
介绍
大家好。 你有没有对 Python 的 Lambda、Map、Filter 和 Reduce 感到困惑? 嗯? 不用担心,我已经为您准备好了。 在本文中,我们将消除您可能遇到的所有困惑。 具体来说,阅读本文后,您将了解:
- 什么是 是 Lambda、Map、Filter 和 Reduce?
- 为什么 我们使用 Lambda、Map、Filter 和 Reduce 吗?
- 创新中心 使用 Lambda、Map、Filter 和 Reduce?
- 什么时候 使用 Lambda、Map、Filter 和 Reduce?
如果您对此主题没有任何困惑,您可以直接进入“摘要”部分。
目录
- LAMBDA
- 地图位置
- 筛选器
- 减少
- 总结
- 尾注
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 函数进一步添加两个数字, x 和 n.
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
请参考下图了解幕后发生的事情。
图片来源:作者
此处,总和以累积/连续的方式执行:((((1 + 2) + 3) + 4) + 5)。
总结
LAMBDA
- 具有许多参数但只有一个表达式的函数。
- 它有助于使我们的代码成为 pythonic 并创建函数包装器。
地图位置
- 将给定函数应用于可迭代对象的每个项目并返回迭代器的函数。
- 它提供了一个 快 根据给定条件转换可迭代对象的方法。
- 它可以有多个迭代器。
筛选器
- 它具有与 map 函数相同的语法。
- 它有助于根据给定条件从可迭代对象中提取项目。
减少
- 它应用一个函数 累积地/相继地 在可迭代的每个项目上并返回单个值。
尾注
今天的讨论到此结束。 感谢您阅读本文! 我希望你喜欢这篇文章,并且像我写这篇文章时一样享受阅读它的乐趣🙂
我是否错过了重要的事情或想分享您的想法? 在下方发表评论,我会尽快回复您。
关于作者
我是 Harsh Dhamecha,人工智能专业最后一年的本科生,机器学习导师和有抱负的数据科学家。 我撰写有关 Python、机器学习和深度学习的文章。
如有任何疑问,可直接 邮箱地址 我,太无聊了吧? 我们有 LinkedIn 和 Twitter. 我经常在 Python、机器学习、深度学习和数据科学上写线程 Twitter. 关注我以保持更新!
你可以看看 其他文章 我已经写了。
还在看这篇文章吗? 特别感谢你🙌