Python语言

关于Python中的匿名函数lambda

2018-08-22  本文已影响19人  君临天下夜未央

lambda是Python编程语言中使用频率较高的一个关键字。那么,什么是lambda?它有哪些用法?

一、语法

lambda [ arg1 [arg2, arg3, … argN] ] : expression
                      – 《Python核心编程》

从《Python核心编程》书本中包含了以上lambda表达式的表述。也就是说在lambda右侧的式子中,冒号左边的为参数值,右边的为计算表达式。

二、 实例说明

1.单层参数求和

现在假设需要对两个数进行求和运算。对于正常的逻辑代码,不难写出如下代码:

def sum(x, y):
    return x + y

而在lambda中,我们可以这样来写:

p = lambda x, y: x + y

代码简洁了许多

2.嵌套参数求和

注:下面的一段代码实际上是存在语法错误的,此代码的目的纯粹只是为了说明问题。请勿模仿

def sum_outer(x=0):
    def sum_inner(y):
        return x + y

采用lambda改写后的代码如下:

def test_lamdba2(x=0):
    return lambda y: x + y

三、特性

lambda函数有如下特性:

四、用法说明

由于lambda语法是固定的,其本质上只有一种用法,那就是定义一个lambda函数。在实际中,根据这个lambda函数应用场景的不同,可以将lambda函数的用法扩展为以下几种:
1.将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。

例如,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。例如,执行add(1,2),输出为3。

2.将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换。

例如,为了把标准库time中的函数sleep的功能屏蔽(Mock),我们可以在程序初始化时调用:time.sleep=lambda x:None。这样,在后续代码中调用time库的sleep函数将不会执行原有的功能。例如,执行time.sleep(3)时,程序不会休眠3秒钟,而是什么都不做。

3.将lambda函数作为其他函数的返回值,返回给调用者。

函数的返回值也可以是函数。例如return lambda x, y: x+y返回一个加法函数。这时,lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。对应的,将包含嵌套函数的函数称之为外部函数。内部函数能够访问外部函数的局部变量,这个特性是闭包(Closure)编程的基础,在这里我们不展开。

4.将lambda函数作为参数传递给其他函数。

部分Python内置函数接收函数作为参数。典型的此类内置函数有这些。

另外,部分Python库函数也接收函数作为参数,例如gevent的spawn函数。此时,lambda函数也能够作为参数传入。

五、变量作用域说明

关于变量在Lambda中的作用域从上面的几幅图中也可以看出一二来,主要可以做出以下几点的总结:

  1. 对局部变量可见
  2. 对全局变量可见
  3. 对当前层传入的参数可见
  4. 对上层函数传入的参数可见
  5. 对上层Lambda传入的参数可见

六、Lambda评价

优点

  1. 在普通代码里几行的代码,在Lambda中只需要一行就可以解决。所以代码比以前更简洁了
  2. 可以在某一个方法内部定义,这样可以提高操作的便捷性
    缺点
  3. Lambda是一个匿名函数,因为是匿名,所以可读性变差了
  4. 有时候有多个Lambda嵌套(就像实例中的第3点一样),让程序变得难以理解
上一篇 下一篇

猜你喜欢

热点阅读