在这篇文章中,将深入探讨 Python 中的匿名函数,也称为 Lambda 函数。将讨论它们是什么、它们的语法、如何使用它们以及一些使用示例。这篇文章将帮助全面理解 Python 中的 Lambda 函数,并探讨何时使用它们以及何时避免使用它们。
在 Python 中,Lambda 函数是一种没有名称的函数定义方式。与使用 def
关键字定义普通函数不同,Lambda 函数使用 lambda
关键字。因此,匿名函数也被称为 Lambda 函数。
Python 中的 Lambda 函数遵循以下语法:
lambda arguments: expression
请注意,Lambda 函数可以有任意数量的参数,但只能有一个表达式。首先,表达式被求值然后返回结果。在需要函数对象的地方使用 Lambda 函数。
在这个部分,将看到一个将输入值翻倍(即乘以二)的 Lambda 函数示例。
double = lambda x: x * 2print(double(10))
代码解释:在上面的代码中,lambda x: x * 2
是一个 Lambda 函数。这里的 x
是参数,x * 2
是被求值并返回给用户的表达式。这个函数没有名称,它返回一个函数对象,该对象被赋值给标识符 double
。现在可以称之为标准函数。语句 double = lambda x: x * 2
几乎等同于:
def double(x): return x * 2
在需要一个临时的无名称函数时使用 Lambda 函数。在 Python 中,通常将 Lambda 函数作为参数传递给高阶函数(接受其他函数作为参数的函数)。例如,这些与内置函数如 filter()
、map()
和 reduce()
等一起使用,将在本文后面讨论。
正如前一节所见,Lambda 函数在解释器级别上被视为与普通函数相同。在某种程度上,可以说 Lambda 函数为返回一个表达式的函数提供了紧凑的语法。然而,必须知道何时使用 Lambda 函数是合适的,何时应该避免使用它们。在这一节中,将学习到 Python 开发者编写 Lambda 函数时使用的基本原则之一。
在生产环境中,永远不应该编写复杂的 Lambda 函数,因为这将使得维护代码的程序员非常难以理解。如果发现自己在编写复杂的单行表达式,定义一个正规的函数可能是一个更好的实践。因此,作为最佳实践,应该记住,简单的代码通常比复杂的代码更好。
filter()
函数用于从元素序列中选择特定的元素。这个函数使用的序列是一个迭代器,如列表、集合、元组等。被选择的元素基于一些预定义的条件。它接受两个参数:一个定义过滤条件的函数和一个序列(任何迭代器,如列表、元组等)。
sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_answer = filter (lambda x: x > 6, sequences)print(list(filtered_answer))
输出:
[10, 8, 7, 11]
代码解释:在第一个语句中,定义了一个名为 sequences 的列表容器,其中包含一些数字。在这里,声明了一个名为 filtered_answer 的变量,它可以存储由 filter()
函数返回的过滤值。一个 Lambda 函数对列表的每个元素运行并返回 true 如果它大于 6。打印由 filter
函数返回的结果。
map()
函数用于对序列中的每个元素执行特定的操作。像 filter()
一样,它也接受两个参数:一个定义要在元素上执行的操作的函数和一个或多个序列。
sequences = [10,2,8,7,5,4,11]squared_result = map (lambda x: x*x, sequences)print(list(squared_result))
输出:
[100, 4, 64, 49, 25, 16, 121]
代码解释:在这里,定义了一个名为 sequences 的列表容器,其中包含一些数字。声明了一个名为 squared_result 的变量,它可以存储映射值。一个 Lambda 函数对列表的每个元素运行并返回该数字的平方。打印由 map
函数返回的结果。
reduce()
函数,像 map()
一样,用于对序列中的每个元素执行操作。然而,它的工作方式与 map
函数略有不同。reduce()
函数计算输出的步骤如下:
步骤 1:对序列的前两个元素执行定义的操作。
步骤 2:保存这个结果
步骤 3:用保存的结果和序列中的下一个元素执行操作。
步骤 4:重复直到没有更多的元素。
它也接受两个参数:一个定义如何执行操作的函数和一个序列(任何迭代器,如列表、元组等)。
from functools import reducesequences = [1,2,3,4,5,6]product = reduce (lambda x, y: x*y, sequences)print(product)
输出:
720
代码解释:从 functools 模块导入 reduce。在这里,定义了一个名为 sequences 的列表容器,其中包含一些数字。声明了一个名为 product 的变量,它可以存储减少的值。一个 Lambda 函数逐步对列表的每个元素运行并返回该数字的乘积,根据前一个结果。打印由 reduce
函数返回的结果。