python Lambda是什么?
在Python lambda函数编程是匿名函数或不具有名称的功能。这是一项小型且受限制的功能,最多只能包含一行。就像普通函数一样,Lambda函数可以在一个表达式中包含多个参数。
在Python中,lambda表达式(或lambda形式)用于构造匿名函数。为此,您将使用lambda关键字(就像使用def定义普通功能一样)。您在Python中定义的每个匿名函数将包含3个基本部分:
- lambda关键字。
- 参数(或绑定变量)
- 函数体。
Lambda函数可以具有任意数量的参数,但是函数主体只能包含一个表达式。而且,lambda是用单行代码编写的,也可以立即调用。您将在接下来的示例中看到所有这些操作。
在此Lambda 教程中,您将学习:
- 语法和例子
- 将lambdas与Python内置函数一起使用
- filter()中的lambdas
- map()中的lambdas
- 在reduce()中的lambda
- 为什么使用lambda函数?
- Lambda与常规函数
语法与范例
编写lambda函数的形式语法如下:
lambda p1, p2: expression
在此,p1和p2是传递给lambda函数的参数。您可以根据需要添加任意数量的参数。
但是,请注意,我们没有像常规函数那样在参数周围使用方括号。最后一部分(表达式)是对提供给函数的参数进行操作的任何有效python表达式。
例1
adder = lambda x, y: x + y print (adder (1, 2))
output:
3
说明:
在这里,我们定义了一个变量,该变量将保存lambda函数返回的结果。
1.用于定义匿名函数的lambda关键字。
2. x和y是我们传递给lambda函数的参数。
3.这是函数的主体,它添加了我们传递的2个参数。请注意,它是一个表达式。您不能在lambda函数的主体中编写多个语句。
4.我们调用该函数并打印返回的值。
例2
了解lambda的基本原理和语法的一个示例。现在,让我们尝试打印一个lambda并查看结果。
string='测试 lambda' print(lambda string : print(string))
Now save your file and hit F5 to run the program. This is the output you should get.
Output:
<function <lambda> at 0x0000024BB2EBAC10>
这里发生了什么事?让我们看一下代码以进一步理解。
代码说明
- 在这里,我们定义了一个字符串,您将把它作为参数传递给lambda。
- 我们声明一个lambda,它调用一个print语句并打印结果。
但是,为什么程序不打印我们传递的字符串?这是因为lambda本身会返回一个函数对象。在此示例中,lambda不会被打印函数调用,而只是返回函数对象和存储它的存储位置。这就是在控制台上打印的内容。
例3
如果代码如下:
x="测试 lambda" (lambda x : print(x))(x)
Output:
测试 lambda
lambda被调用,我们传递的字符串将在控制台上打印。但是,那奇怪的语法是什么?为什么括号中包含了lambda定义?现在让我们了解一下。
代码说明
- 这是我们在上一个示例中定义的相同字符串。
- 在这一部分中,我们定义一个lambda并通过将字符串作为参数传递来立即调用它。这就是所谓的IIFE,您将在本教程的后续部分中进一步了解它。
例4
def test( funct, *args ): funct( *args ) def printer_one( arg ): return print (arg) def printer_two( arg ): print(arg) test( printer_one, 'printer_one' ) test( printer_two, 'printer_two \n' ) test(lambda: printer_one('printer_one LAMBDA ')) test(lambda: printer_two('printer_two LAMBDA '))
Now, save the file and hit F5 to run the program. If you didn’t make any mistakes, the output should be something like this.
Output:
printer_one printer_two printer_one LAMBDA printer_two LAMBDA
将lambdas与Python内置函数一起使用
Lambda函数提供了一种优雅而强大的方法来使用Python中的内置方法执行操作。之所以可能,是因为可以立即调用lambda,并将其作为参数传递给这些函数。
Python Lambda中的IIFE
IIFE代表立即调用的函数执行。这意味着lambda函数一经定义就可以调用。让我们通过一个例子来理解这一点。启动您的IDLE,然后输入以下内容:
(lambda x: x + x)(2)
Output:
4
filter中的lambdas
过滤器功能用于从一系列元素中选择某些特定元素。该序列可以是任何迭代器,例如列表,集合,元组等。
将要选择的元素基于一些预定义的约束。它包含2个参数:
- 定义过滤约束的函数
- 一个序列(任何迭代器,如列表,元组等)
例子:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
output:
[10, 8, 7, 5, 11]
代码说明:
1.在第一条语句中,我们定义一个称为序列的列表,其中包含一些数字。
2.在这里,我们声明一个名为filtered_result的变量,该变量将存储filter()函数返回的过滤后的值。
3.在列表的每个元素上运行的lambda函数,如果大于4,则返回true。
4.打印过滤功能返回的结果。
map()中的lambdas
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]
代码说明:
- 在这里,我们定义了一个称为序列的列表,其中包含一些数字。
- 我们声明一个名为filtered_result的变量,该变量将存储映射的值
- 一个lambda函数,它在列表的每个元素上运行并返回该数字的平方。
- 打印map返回的结果。
reduce()中的lambda
类似于map()的reduce函数用于将操作应用于序列中的每个元素。但是,它的工作方式不同于map。这些是reduce()函数执行的以下步骤以计算输出:
步骤1)对序列的前2个元素执行定义的操作。
步骤2)保存此结果
步骤3)使用保存的结果和序列中的下一个元素执行操作。
步骤4)重复,直到没有剩余的元素。
它还具有两个参数:
- 定义要执行的操作的功能
- 一个序列(任何迭代器,如列表,元组等)
例子,这是一个返回列表中所有元素的乘积的程序:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
output:
120
代码说明:
- 从functools模块导入reduce
- 在这里,我们定义了一个称为序列的列表,其中包含一些数字。
- 我们声明一个名为product的变量,该变量将存储减少的值
- 在列表的每个元素上运行的lambda函数。它将根据先前的结果返回该数字的乘积。
- 打印由reduce函数返回的结果。
为什么使用lambda函数?
正如您将在下一节中看到的那样,在解释器级别将lambda与常规函数相同。在某种程度上,您可以说lambda提供了紧凑的语法来编写返回单个表达式的函数。
但是,您应该知道何时使用lambda以及何时避免使用lambda是一个好主意。在本部分中,您将学习python开发人员在编写lambda时使用的一些设计原则。
Lambda的最常见用例之一是函数式编程,因为Python支持一种称为函数式编程的编程范例(或样式)。
它允许您将一个函数作为另一个函数的参数提供(例如,在地图,过滤器等中)。在这种情况下,使用lambda提供了一种优雅的方式来创建一次性函数并将其作为参数传递。
什么时候不应该使用Lambda?
您永远不应在生产环境中编写复杂的lambda函数。对于维护您的代码的编码人员来说,解密它是非常困难的。如果您发现自己制作复杂的单线表达式,定义适当的函数将是一种非常出色的做法。作为最佳实践,您需要记住,简单代码总是比复杂代码更好。
Lambda与普通函数
如前所述,lambda是没有绑定标识符的函数。用简单的话来说,它们是没有名称的函数(因此是匿名的)。下表说明了lambda和常规函数在python中的区别。
Lambdas语法:
lambda x : x + x
普通函数语法:
def (x) : return x + x
Lambda函数的主体中只能有一个表达式。
正则函数的主体中可以具有多个表达式和语句。
Lambda没有与之关联的名称。这就是为什么它们也被称为匿名函数的原因。
普通函数必须具有名称和签名。
Lambda不包含return语句,因为主体会自动返回。
需要返回值的函数应包含一个return语句。
区别
lambda和正则函数之间的主要区别在于,lambda函数仅计算单个表达式并产生一个函数对象。因此,我们可以命名lambda函数的结果,并像前面的示例一样在程序中使用它。
上面示例的普通函数如下所示:
def adder (x, y): return x + y print (adder (1, 2))
在这里,我们必须为函数定义一个name ,该name 将在调用时return结果。Lambda函数不包含return语句,因为它只有一个表达式,默认情况下始终返回。您甚至不必分配一个lambda,因为它可以立即被调用(请参阅下一节)。如下面的示例所示,当lambda与Python的内置函数一起使用时,它们将变得特别强大。
概要
- Lambda,也称为匿名函数,是小型的受限函数,不需要名称(即标识符)。
- Python中的每个lambda函数都有3个基本部分:
- lambda关键字。
- 参数(或绑定变量)
- 函数体。
- 编写lambda的语法是:lambda参数:expression
- Lambda可以具有任意数量的参数,但不包含在括号中
- Lambda的函数体内只能有1个表达式,默认情况下会返回该表达式。
- 在字节码级别,解释器对lambda和常规函数的处理方式之间没有太大区别。
- Lambda通过以下语法支持IIFE:(lambda参数:expression)(自变量)
- Lambda通常与以下python内置函数一起使用:
- 过滤器:过滤器(lambda参数:表达式,可迭代序列)
- 映射:映射(lambda参数:表达式,可迭代序列)
- 减少:减少(lambda参数1,参数2:表达式,可迭代序列)
- 不要在生产环境中编写复杂的lambda函数,因为这对于代码维护者来说很困难。