Lambda函数编程是匿名函数或没有名称的函数。 这是一项小型且受限制的功能,最多只能包含一行。 就像普通函数一样,Lambda函数可以在一个表达式中包含多个参数。 python中的Lambda函数不需要任何return语句。
如今,许多现代编程语言(例如Java,Python,C#和C ++)都支持lambda函数以向这些语言添加功能。
在Python中,lambda表达式用于构造匿名函数。 为此,您将使用lambda关键字(就像使用def定义常规函数一样)。
您在Python中定义的每个匿名函数将包含3个基本部分:
Lambda函数可以具有任意数量的参数,但函数主体只能包含一个表达式,lambda是用单行代码编写的。
编写lambda函数的形式语法如下:
lambda p1, p2: expression
在此,p1和p2是传递给lambda函数的参数。 您可以根据需要添加任意数量的参数。
但是,请注意,我们没有像常规函数那样在参数周围使用括号。 expression是对您提供给函数的参数进行操作的任何有效python表达式。
示例1
既然您已经了解了lambda,现在让我们以一个示例进行尝试。 因此,打开您的编辑器并输入以下内容:
adder = lambda x, y: x + y
print (adder (1, 2))
output:
3
代码说明
在这里,我们定义了一个变量adder,该变量将保存lambda函数返回的结果。
示例2
这是了解lambda的基本原理和语法的一个基本示例。 现在,让我们尝试打印一个lambda并查看结果。 再次,打开您的IDLE并输入以下内容:
#What a lambda returns
string='some kind of a useless lambda'
print(lambda string : print(string))
现在保存文件,然后按F5键运行该程序。 这是您应该获得的输出。
Output:
<function <lambda> at 0x00000185C3BF81E0>
这里发生了什么事? 让我们看一下代码以进一步理解。
代码说明
但是,为什么程序不打印我们传递的字符串? 这是因为lambda本身会返回一个函数对象。 在此示例中,lambda不会被打印函数调用,而只是返回函数对象和存储它的存储位置。 这就是在控制台上打印的内容。
示例3
但是,如果您编写这样的程序:
#What a lambda returns #2
x="some kind of a useless lambda"
(lambda x : print(x))(x)
并按F5运行它,您将看到类似这样的输出。
Output:
some kind of a useless lambda
现在,lambda被调用,我们传递的字符串将在控制台上打印。 但是,那奇怪的语法是什么?为什么lambda定义放在括号中? 现在让我们了解一下。
代码说明
示例4
让我们看一个最后的示例,以了解lambda和常规函数是如何执行的。 因此,打开您的IDLE并在一个新文件中键入以下内容:
#A REGULAR FUNCTION
def guru( funct, *args ):
funct( *args )
def printer_one( arg ):
return print (arg)
def printer_two( arg ):
print(arg)
#CALL A REGULAR FUNCTION
guru( printer_one, 'printer 1 REGULAR CALL' ) #调用函数名和参数是分开写
guru( printer_two, 'printer 2 REGULAR CALL \n' ) #
#CALL A REGULAR FUNCTION THRU A LAMBDA
guru(lambda: printer_one('printer 1 LAMBDA CALL')) #像普通函数一样写好printer_one('printer 1 LAMBDA CALL'),不需要分开写函数名和参数
guru(lambda: printer_two('printer 2 LAMBDA CALL')) #
现在,保存文件并按F5键运行该程序。 如果您没有犯任何错误,则输出应该是这样的。
Output:
printer 1 REGULAR CALL
printer 2 REGULAR CALL
printer 1 LAMBDA CALL
printer 2 LAMBDA CALL
代码说明
Lambda函数提供了一种优雅而强大的方法来使用Python中的内置函数执行操作。 之所以可能,是因为可以立即调用lambda,并将其作为参数传递给这些函数。
IIFE代表立即调用的函数执行。 这意味着lambda函数一经定义就可以调用。 让我们通过一个例子来理解这一点。 启动您的IDLE,然后输入以下内容:
(lambda x: x + x)(2)
这是输出和代码说明:
立即调用lambda的功能使您可以在诸如map()和reduce()之类的函数中使用它们。 这很有用,因为您可能不想再次使用这些函数。
filter 函数用于从一系列元素中选择某些特定元素。 该序列可以是任何迭代器,例如列表,集合,元组等。
将要选择的元素基于一些预定义的约束。 它包含2个参数:
例如,
sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = filter (lambda x: x > 4, sequences)
print(list(filtered_result))
输出
[10, 8, 7, 5, 11]
代码说明:
map函数用于将特定操作应用于序列中的每个元素。 与filter()一样,它也有2个参数:
例如,这是一个在给定列表中打印数字平方的程序:
sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = map (lambda x: x*x, sequences)
print(list(filtered_result))
Output:
[100, 4, 64, 49, 25, 16, 121, 0, 1]
代码说明:
类似于map()的reduce函数用于将操作应用于序列中的每个元素。但是,它的工作方式不同于map。
这些是reduce()函数计算输出的步骤:
reduce是不断减少列表的元素的意思,减少的办法是先处理前面两个元素,然后迭代处理后面的元素。
它还具有两个参数:
例如,这是一个返回列表中所有元素的乘积的程序:
from functools import reduce
sequences = [1,2,3,4,5]
product = reduce (lambda x, y: x*y, sequences)
print(product)
输出
120
代码说明:
正如您将在下一节中看到的那样,在解释器级别lambda与常规函数相同。在某种程度上,您可以说lambda提供紧凑的语法来编写返回单个表达式的函数。
但是,您应该知道何时使用lambda以及何时避免使用lambda。在本节中,您将学习python开发人员在编写lambda时使用的一些设计原则。
lambda的最常见用例之一是函数式编程,因为Python支持一种称为函数式编程的编程范例(或样式)。
它允许您将一个函数作为另一个函数的参数提供(例如,在map,filter等)。在这种情况下,使用lambda提供了一种优雅的方式来创建一次性函数并将其作为参数传递。
什么时候不应该使用Lambda?
您永远不应在生产环境中编写复杂的lambda函数。对于维护您的代码的编码人员来说,解密它是非常困难的。如果您发现自己制作复杂的one-liner表达式,定义适当的函数将是一种非常出色的做法。作为最佳实践,您需要记住,简单代码总是比复杂代码更好。
如前所述,lambda是没有名称的函数(因此是匿名的)。下表说明了lambda和常规函数在python中的区别。
lambda x : x + x
def (x) :
return x + x