lambda表达式
一、定义
lambda 表达式(有时称为 lambda 构型)被用于创建匿名函数。 表达式 lambda parameters: expression 会产生一个函数对象 。 该未命名对象的行为类似于用以下方式定义的函数:
def <lambda>(parameters):
return expression
二、用法
2.1 用来编写简单的函数
- 单个参数
>>> f = lambda x: x*2
>>> f(2)
4
- 多个参数
>>> g = lambda x,y=2,z=3: x+y+z
>>> g(3,5,8)
16
- lambda中实现if-else(三元运算、三目运算、条件表达式)
eg:输出两个数中较大的数
>>> upper = lambda x,y:x if x>y else y
>>> upper(3,8)
8
2.2 捕获变量值的原理
lambda表达式中的参数是一个自由变量, 在运行时绑定值,而不是定义时就绑定。
eg:
>>> x=10
>>> f = lambda y: x+y
>>> x=20
>>> g = lambda y: x+y
>>> f(15) #执行这一步时绑定值,x=20
35
>>> g(15)
35
如果想让lambda函数在定义时就绑定到值,可以将参数值定义成默认参数。
>>> x=10
>>> f = lambda y,x=x: x+y #定义成默认参数的参数要放后面,不然会报错SyntaxError
>>> x=20
>>> g = lambda y,x=x: x+y
>>> f(15)
25
>>> g(15)
35
2.3 与map、filter、reduce函数结合使用
-
map(func,seq)
将函数func应用于seq的每个元素。python3中返回一个迭代器。
eg1:将一个列表里的每个元素乘以2
>>> l = [3,5,6,7,9] >>> list(map(lambda x: x*2,l)) [6, 10, 12, 14, 18]
eg2:可以给map函数传入多个序列参数,func函数的参数值会依次从并行的序列中拿
>>> a = [4,10] >>> b = [15,8] >>> list(map(lambda x,y: x+y,a,b)) [19, 18] #依次取4+15=19,10+8=18
-
filter(func,seq)
过滤序列中的所有元素,返回那些传入func后返回True的元素。也就是说filter函数的第一个参数func必须返回一个布尔值。
eg1:从一个列表中过滤出大于30的数
>>> l = [57,23,11,4,38] >>> list(filter(lambda x: x>30,l)) [57, 38]
eg2:判断两个列表的交集
>>> a = [2,7,5,9,3] >>> b = [11,2,10,7,4] >>> list(filter(lambda x: x in a,b)) [2, 7]
-
reduce(func,seq)
Python3中reduce移到了functools模块中,需要通过“from functools import reduce”来使用它。
如果func是具有两个参数,返回一个值的函数,每次选取序列中的前两个元素,传入func中,得到的结果和剩余元素一起组成新的序列,再选取序列中的前两个元素…,这样一直计算到最后,得到一个值,把它作为reduce的结果返回。eg:求1~100的和
>>> from functools import reduce >>> reduce(lambda x,y: x+y, range(1,101)) 5050