美文网首页Python语言
关于Python中的匿名函数lambda

关于Python中的匿名函数lambda

作者: 君临天下夜未央 | 来源:发表于2018-08-22 18:47 被阅读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函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
    • lambda函数一般功能简单:单行expression决定了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内置函数接收函数作为参数。典型的此类内置函数有这些。

    • filter函数。此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定将列表[1,2,3]中能够被3整除的元素过滤出来,其结果是[3]。

    • sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。

    • map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]。

    • reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。

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

    五、变量作用域说明

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

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

    六、Lambda评价

    优点

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

    相关文章

      网友评论

        本文标题:关于Python中的匿名函数lambda

        本文链接:https://www.haomeiwen.com/subject/bjnyiftx.html