前言:
在日常开发的过程中,有时候会临时用到一些简单的函数,她们的业务逻辑会相对简单,简单到并不值得让他们留下名字,这个时候,就很值得使用匿名函数 lambda
函数来完成这个需求。
lambda表达式格式
1
|
lambda arguments : statement |
表达式以 lambda
关键字开头,冒号 ":" 左侧是函数的传入参数,当有多个入参时使用逗号划分开,冒号右侧是返回值的表达式语句,函数会根据表达式计算结果并将其返回。lambda
表达式会创建一个函数对象,可以对其赋值并如同普通函数一样使用。下面定义了一个求平方的 lambda 表达式:
1
2
|
>>> lambda x : x * x <function < lambda > at 0x000001C98ED8E040 > |
其中x是该函数的参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求该变量的平方,但作为一个函数,没有名字如何使用呢?
这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能。
1
2
3
4
5
|
>>> square = lambda x : x * x >>> square <function < lambda > at 0x000001C98F24B040 > >>> square( 8 ) 64 |
它等同于常规函数
1
2
3
4
5
6
7
|
>>> def square(x: int ) - > int : ... return x * x ... >>> square <function square at 0x000001C98ED8E040 > >>> square( 8 ) 64 |
通过这个例子可以很明显观察到,lambda表达式和普通函数表达式在表现上的区别,lambda声明之后在python虚拟机中是记录为lambda,而普通函数会吧函数名直接体现出来,试想当发生异常的时候,Traceback
打印了异常信息,但是不标记准确位置,也不跟你说哪个函数出问题,这样排错效率将极大的降低。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>> div1 = lambda x : 1 / x >>> div1( 0 ) Traceback (most recent call last): File "<stdin>" , line 1 , in <module> File "<stdin>" , line 1 , in < lambda > ZeroDivisionError: division by zero >>> def div2(x: int ) - > int : ... return 1 / 0 ... >>> div2( 0 ) Traceback (most recent call last): File "<stdin>" , line 1 , in <module> File "<stdin>" , line 2 , in div2 ZeroDivisionError: division by zero |
如代码所示,对于div1来说,发生异常了,之跟你说你写的某个lambda
函数有异常,而且是在它的第一行,但就不跟你说是哪个函数:),但对于div2来说,就会很直接的说明,div2
的第二行出问题了,这很容易定位啊,喏,这也很直观的暗示我们,写lambda不能太复杂,要尽最大努力的令其简洁,永不出错,如果有可能会有异常发生,倒还不如写成普通函数来的痛快。这个以上《Effective Python》所提倡的:使用辅助函数来取代复杂的表达式,并赋予函数清晰的名称以提高代码可读性。
匿名的用法
对于lambda
来说,更多时候是用在高阶函数中,将其自己作为参数传入高阶函数中,比如在map
、filter
和 reduce
函数,这些函数接收一个函数作为参数,如果不想额外定义函数,那么使用 lambda 表达式创建匿名函数就是最佳的应用场景。
1
2
3
4
5
6
|
>>> list ( map ( lambda x : x * x, [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ])) [ 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 ] >>> list ( filter ( lambda x : x < 2 , [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ])) [ 1 ] >>> reduce ( lambda x, y: x + y, [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]) 36 |
到此这篇关于python lambda 表达式形式分析的文章就介绍到这了,更多相关python lambda内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.51cto.com/nu1l/5169490