Python lambda function
Python lambda function
Table of Contents
匿名函数lambda用法总结
既然lambda被称为匿名函数,那么我们只需要把握一点,即我们可以用 函数的观点来理解lambda的书写和调用方式,它返回的是一个函数对象。
lambda的一般使用方法
本小节内容转载自https://juejin.im/post/5d00b7efe51d4555fd20a31c
无参匿名函数
# 可以将lambda直接传递给一个变量,像调用一般函数一样使用
B = lambda :True
print(B())
# 等价于
def BF():
return True
print(BF())
# 示例结果
True
True
有参匿名函数
支持单参数多参数,同时也可以带默认值, 这里举一个多参数的例子:
two_sum = lambda x, y: x + y
# 等同于:
def two_sum(x, y): return x + y
print(two_sum(1,2))
# 示例结果
3
我们也可以直接从后边传参:
two_sum = (lambda x, y: x + y)(3, 4)
print(two_sum)
# 示例结果
7
lambda的高阶应用方法
与list的结合(字典同理)
list_a = [lambda a: a**3, lambda b: b**3]
# 是一个函数对象
print(list_a[0])
<function <lambda> at 0x0259B8B0>
g = list_a[0]
# 把其中的值拿出来
print(g(2))
8
三元表达式结合求最小值
lower = lambda x,y: x if x<y else y
print(lower(10,100))
与map/reduce/filter/sorted函数的结合
之所以把这几个函数拿出来,是因为lambda的使用在调用这几个函数时格外常见, 因为可以大大缩减代码量
本小节内容参考CSDN用户-浅浅爱默默
filter()
filter函数的作用是过滤序列,把满足条件的元素留下来,返回一个迭代器对象(意味着如果想要列表需要手动转换),
语法:
filter(function, iterable)
result=[('G1','2','song'),('D2','2',''),('T3','','shaopu'),('K4','','3')]
print(list(filter(lambda i: i[0][0] in "GD",result)))
print(list(filter(lambda i: i[0][0] not in "GD",result)))
[('G1', '2', 'song'), ('D2', '2', '')]
[('T3', '', 'shaopu'), ('K4', '', '3')]
map()
map函数的作用是根据提供的函数对指定序列做映射,
语法:
map(function, iterable, ...)
#遍历map,根据不同的对象输出不同的结果,map(操作,操作对象)
a=[5,6,7,8,9,10,11,12]
def plus(i):
return i+10
print(map(plus,a))
#计算列表a中各个元素,返回一个迭代器
print(list(map(plus,a)))
#以列表形式返回映射后的结果
print(map(lambda i:i+10,a))
#使用lambda匿名函数,返回一个迭代器
print(list(map(lambda i:i+10,a)))
#以列表形式返回映射后的结果
# 运行结果:
<map object at 0x000001D694A89550>
[15, 16, 17, 18, 19, 20, 21, 22]
<map object at 0x000001D694A89128>
[15, 16, 17, 18, 19, 20, 21, 22]
# 提供了两个列表,对相同位置的列表数据进行相加
print(list(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])))
# 运行结果:
[3, 7, 11, 15, 19]
reduce()
reduce函数的作用是对序列中的元素进行递归操作。reduce() 函数会对参数序列中元素进行累积。 函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作, 得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
在py3中需要从functools导入
语法:
reduce(function, iterable[, initializer])
#reduce()递归,两个参数
from functools import reduce
print(reduce(lambda i,j:i*j,range(1,10))) #1*2*3*4*5*6*7*8*9(含左不含右)
print(reduce(lambda i,j:i+j,range(1,10))) #1+2+3+4+5+6+7+8+9
sorted()
语法:
sorted(iterable[, key[, reverse]])
这个例子看下图像处理部分的调用就可以了:
(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes), key=lambda b: b[1][i], reverse=reverse))
for循环与lambda
本小节内容参考https://www.cnblogs.com/liuq/p/6073855.html
- f = [lambda x: x*i for i in range(4)]
这种表达形式等价于:
def func():
fs = []
for i in range(4):
def lam(x):
return x*i
fs.append(lam)
return fs
当调用func()时,每循环一次,将lam函数的地址存到fs中。 因为在每次循环中lam函数都未绑定i的值,所以直到循环结束, i的值为3,并将lam中所用到的i值定为3 ,因此真正调用(例如f0)的时候i值保持不变(为3)
>>> f = [lambda x:x*i for i in range(4)]
>>> f[0](1)
3 # 1*3
>>> f[1](1)
3 # 1*3
>>> f[2](1)
3 # 1*3
>>> f[3](1)
3 # 1*3
>>> f[0](3)
9 # 3*3
>>> f[1](3)
9 # 3*3
>>> f[2](3)
9 # 3*3
>>> f[3](3)
9 # 3*3
如果把x换成i,那就与传入的值无关了,始终是3*3
f = [lambda :i*i for i in range(4)] # f = [lambda i:i*i for i in range(4)]
- f1 = [lambda i=i: i*i for i in range(4)]
这种表达形式等价于:
def func():
fs = []
for i in range(4)
def lam(x=i): # 即 i=i
return x*x # 即 i*i
fs.append(lam)
return fs
当调用 func() 时,每循环一次,将lam函数的地址存到 fs中。但是在每次循环中lam函数都将i值绑定到了x上,函数在定义时因为默认参数的存在,就给形参赋上了初值, 所以直到循环结束,不同地址的lam函数的x值为都不一样, 因此真正调用(例如 f[0])的时候x值都为当时被绑定的值。
>>> f1 = [lambda i=i: i*i for i in range(4)]
>>> f1[0]()
0
>>> f1[1]()
1
>>> f1[2]()
4
>>> f1[3]()
9
这也意味着如果我们给x赋了新值,那么结果也会随之改变。
- f2 = [lambda x=i: i*i for i in range(4)]
这种表达形式等价于:
def func():
fs = []
for i in range(4)
def lam(x=i):
return i*i
fs.append(lam)
return fs
虽然lam函数将i的值绑定到了x上,但函数体中并未使用x,所以直到循环结束,i的值变为3,才会在调用时使用。其实同第一种情况是一样的。
>>> f2 = [lambda x=i: i*i for i in range(4)]
>>> f2[0]()
9
>>> f2[1]()
9
>>> f2[2]()
9
>>> f2[3]()
9
>>> f2[0](7)
9
>>> f2[1](7)
9
>>> f2[2](7)
9
在之后的讨论中,我们会再看几个稍微复杂的lambda嵌套的例子,并由此引出一个深坑–闭包。