python匿名函数(lambda function)

作者: 王吉吉real | 来源:发表于2018-01-08 01:28 被阅读0次

    在python中,除了一般使用def定义的函数外,还有一种使用lambda定义的匿名函数。这种函数可以用在任何普通函数可以使用的地方,但在定义时被严格限定为单一表达式。从语义上讲,它只是普通函数的语法糖。

    lambda表达式

    lambda表达式定义如下:

    lambda argument1,argument2,...argumentN:expression using arguments

    有lambda表达式定义出来的函数对象和由def定义出来的函数对象工作起来完全一样。

    >>> def foo(x):
    ...     return x*2
    ... 
    >>> bar = foo
    >>> bar(2)
    4
    >>> bar = lambda x : x*2
    >>> bar(2)
    4
    

    但由于lambda表达式特殊的设计,在特定的场景中也带来了一些不同的体验。

    • lambda是一个表达式,不是一个语句 这就使它能够出现在一些def不能出现的地方,比如,列表常量中。
    • lambda是单个的表达式,不是一个代码块 lambda的设计是为了满足简单函数的场景,仅能封装有限的逻辑,有复杂逻辑的情况有def来处理,所以lambda的功能要比def小的多。

    另外,lambda表达式是可以嵌套的

    >>> action = (lambda x : (lambda y : x + y))
    >>> a = action(10)
    >>> a(5)
    15
    

    这就是一个用lambda实现的闭包,与普通闭包一样,内嵌lambda表达式可以获得上层lambda函数的变量。

    匿名函数的使用

    匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如,几个内置函数:filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法

    filter函数

    >>> list = [1, 2, 3]
    >>> result = filter(lambda x: x%2==0, list)
    >>> result
    [2]
    >>> result = [x for x in list if x%2==0]
    >>> result
    [2]
    

    map函数

    >>> result = map(lambda x: x*2, list)
    >>> result
    [2, 4, 6]
    >>> result = [x*2 for x in list]
    >>> result
    [2, 4, 6]
    

    reduce函数

    >>> result = reduce(lambda x, y: x+y,list)
    >>> result
    6
    >>> result = sum(list)
    >>> result
    6
    

    除reduce函数的替代用法比较特殊外,map和filter函数都可以使用列表推导式(list comprehension)代替。据说,当年lambda是一个Lisp程序员给python加的,而Guido是强烈反对的,他中意的是列表推导式。

    跳转表(jump table)

    lambda的另一种用法是用来编写跳转表,也就是行为列表或字典,能按需执行特定的动作。

    >>> key = "get"
    >>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}[key]()
    8
    

    这样在字典中,每个lambda都留下了一个后续可以调用的函数,通过索引可以取出来,并调用。这就使字段可以成为更加通用的多路分支工具。

    注:lambda的名字来自Lisp,Lisp是从lambda calculus取得该名字的。

    相关文章

      网友评论

        本文标题:python匿名函数(lambda function)

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