python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配。其语法是:
lambda [arg1[, arg2, ... argn]]: expression
其中,参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现。
下面举例来说明lambda语句的使用方法(无参数)。
1
2
3
4
5
6
7
8
9
10
11
12
|
# 使用def定义函数的方法 def true(): return true #等价的lambda表达式 >>> lambda :true <function < lambda > at 0x0000000001e42518 > # 保留lambda对象到变量中,以便随时调用 >>> true = lambda :true >>> true() true |
下面再举一个带参数的例子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 使用def定义的函数 def add( x, y ): return x + y # 使用lambda的表达式 lambda x, y: x + y # lambda也允许有默认值和使用变长参数 lambda x, y = 2 : x + y lambda * z: z # 调用lambda函数 >>> a = lambda x, y: x + y >>> a( 1 , 3 ) 4 >>> b = lambda x, y = 2 : x + y >>> b( 1 ) 3 >>> b( 1 , 3 ) 4 >>> c = lambda * z: z >>> c( 10 , 'test' ) ( 10 , 'test' ) |
但由于lambda表达式特殊的设计,在特定的场景中也带来了一些不同的体验。
lambda是一个表达式,不是一个语句 这就使它能够出现在一些def不能出现的地方,比如,列表常量中。
lambda是单个的表达式,不是一个代码块 lambda的设计是为了满足简单函数的场景,仅能封装有限的逻辑,有复杂逻辑的情况有def来处理,所以lambda的功能要比def小的多。
另外,lambda表达式是可以嵌套的
1
2
3
4
|
>>> action = ( lambda x : ( lambda y : x + y)) >>> a = action( 10 ) >>> a( 5 ) 15 |
这就是一个用lambda实现的闭包,与普通闭包一样,内嵌lambda表达式可以获得上层lambda函数的变量。
匿名函数的使用
匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如,几个内置函数:filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法
filter函数
1
2
3
4
5
6
7
|
>>> 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函数
1
2
3
4
5
6
|
>>> result = map ( lambda x: x * 2 , list ) >>> result [ 2 , 4 , 6 ] >>> result = [x * 2 for x in list ] >>> result [ 2 , 4 , 6 ] |
reduce函数
1
2
3
4
5
6
|
>>> 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的另一种用法是用来编写跳转表,也就是行为列表或字典,能按需执行特定的动作。
1
2
3
|
>>> key = "get" >>> { "abc" :( lambda : 2 + 2 ), "bcd" : ( lambda : 3 + 3 ), "get" : ( lambda : 4 + 4 )}[key]() 8 |
这样在字典中,每个lambda都留下了一个后续可以调用的函数,通过索引可以取出来,并调用。这就使字段可以成为更加通用的多路分支工具。
以上所述是小编给大家介绍的python匿名函数(lambda函数)详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://blog.csdn.net/qq_38526635/article/details/81326004