简单来说, lambda 表达式通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
- lambda只是一个表达式,函数体比def简单很多
- lambda的主体是一个表达式,而不是一个代码块。仅仅能表达有限的逻辑
- lambda表达式是起到一个函数速写的作用,允许在代码内嵌入一个函数的定义
lambda格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值
lambda <变量名> : <逻辑表达式> #冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值
#例如单个变量:lambda x : pow(x)
#多变量:lambda x,y : x+y
单变量函数表达式实例:
#定义一个x平方的函数
In [1]: a = lambda x: pow(x,2)
In [2]: a(2)
Out[2]: 4
多变量函数表达式实例:
In [3]: b = lambda x,y: x+y
In [4]: b(2,3)
Out[4]: 5
通常lambda定义匿名函数,主要结合运用场景进行使用:
- 函数式编程:以sorted、reduce、map、filter函数作为支持,lambda函数就可以应用在函数式编程中
- 作为闭包,作为定义在函数的内部的函数使用
1.1、map(func,seqs)与lambda
In [5]: list(map(lambda x: pow(x,2),list(range(5))))
Out[5]: [0, 1, 4, 9, 16]
1.2、sorted与lambda将list的数按照lambda定义的的key值排序
#一个整数列表,要求按照列表中元素的绝对值大小升序排列
In [18]: list1 = [3,5,-4,-1,0,-2,-6]
...: sorted(list1, key=lambda x: abs(x))
...:
Out[18]: [0, -1, -2, 3, -4, 5, -6]
1.3、filter(func,seqs)与lambda
# list1 = [3,5,-4,-1,0,-2,-6]
In [25]: list(filter(lambda x:x > 0,list1))
Out[25]: [3, 5]
1.4、reduce(function,seqs)与lambda
#其中reduce函数是python中的一个二元内建函数,它可以通过传给reduce中的函数(必须是二元函数)
#**依次**对数据集中的数据进行操作。例如传给reduce的函数是做加法,数据集是list1,那么reduce
#函数的作用就是将数据集中的数据依次相加
# list1 = [3,5,-4,-1,0,-2,-6]
In [30]: reduce(lambda x,y:x+y,list1)
Out[30]: -5
2、作为闭包,作为定义在函数的内部的函数使用
- 可以简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。
In [37]: def add_f(x):
...: return lambda y:y+x
...:
In [38]: add_f(4)(7)
Out[38]: 11
这里的lambda函数就是一个闭包,在全局作用域范围中,add_f(4)(7)正常执行且返回值为11,之所以返回11是因为在add_f局部作用域中,变量y的值在闭包的作用使得它在全局的作用域也可以被访问到。