Menu Close

Python Lambda函数

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>

这里发生了什么事?让我们看一下代码以进一步理解。

代码说明

  1. 在这里,我们定义了一个字符串,您将把它作为参数传递给lambda。
  2. 我们声明一个lambda,它调用一个print语句并打印结果。

但是,为什么程序不打印我们传递的字符串?这是因为lambda本身会返回一个函数对象。在此示例中,lambda不会被打印函数调用,而只是返回函数对象和存储它的存储位置。这就是在控制台上打印的内容。

例3

如果代码如下:

x="测试 lambda"
(lambda x : print(x))(x)

Output:

测试 lambda

lambda被调用,我们传递的字符串将在控制台上打印。但是,那奇怪的语法是什么?为什么括号中包含了lambda定义?现在让我们了解一下。

代码说明

  1. 这是我们在上一个示例中定义的相同字符串。
  2. 在这一部分中,我们定义一个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个参数:

  1. 定义要在元素上执行的操作的函数
  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]

代码说明:

  1. 在这里,我们定义了一个称为序列的列表,其中包含一些数字。
  2. 我们声明一个名为filtered_result的变量,该变量将存储映射的值
  3. 一个lambda函数,它在列表的每个元素上运行并返回该数字的平方。
  4. 打印map返回的结果。

reduce()中的lambda

类似于map()的reduce函数用于将操作应用于序列中的每个元素。但是,它的工作方式不同于map。这些是reduce()函数执行的以下步骤以计算输出:

步骤1)对序列的前2个元素执行定义的操作。

步骤2)保存此结果

步骤3)使用保存的结果和序列中的下一个元素执行操作。

步骤4)重复,直到没有剩余的元素。

它还具有两个参数:

  1. 定义要执行的操作的功能
  2. 一个序列(任何迭代器,如列表,元组等)

例子,这是一个返回列表中所有元素的乘积的程序:

from functools import reduce
sequences = [1,2,3,4,5]
product = reduce (lambda x, y: x*y, sequences)
print(product)

output:

120

代码说明:

  1. 从functools模块导入reduce
  2. 在这里,我们定义了一个称为序列的列表,其中包含一些数字。
  3. 我们声明一个名为product的变量,该变量将存储减少的值
  4. 在列表的每个元素上运行的lambda函数。它将根据先前的结果返回该数字的乘积。
  5. 打印由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函数,因为这对于代码维护者来说很困难。
Posted in Python

发表评论

相关链接