简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
我们看下面这个例子!返回一个序列的平方。
def f(x):
return x*x
lis = list(map(f,[y for y in range(10)]))
print(lis)
上面这个例子如果我们用lamdba来实现的话,只需要如下所示!
lis = list(map(lambda x : x*x,[i for i in range(10)]))
print(lis)
明显可以看到lamdba表达式书写简单很多!当我们遇到某处只需要一个能做一件事请的函数而已,连它叫什么名字都无关紧要时,lamdba表达式就可以来做这件事!
那么,我们看到lamdba的语法形式如下:
lambda argument_list: expression
其中,lambda是Python预留的关键字,argument_list和expression由用户自定义。
lamdba表达式有如下特性:
1、lambda函数是匿名的:所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。
2、lambda函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
3、lambda函数一般功能简单:单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明。注意:python的lamdba只能有一条表达式组成,这个限制主要是为了防止滥用。
回头来看map()函数,它可以将一个函数映射到一个可枚举类型上面。函数原型如下:
map(f,lis)
也就是将函数f依次套用在lis的每一个元素上面。而这个函数f我们通常会用lamdba表达式替换,使代码更加的简洁!
下面我们用例子来说明filter和map用法的不同!
lis1 = list(map(lambda x : x % 2 == 0,[i for i in range(10)]))
print(lis1)
lis2 = list(filter(lambda x : x % 2 == 0,[i for i in range(10)]))
print(lis2)
#output
[True, False, True, False, True, False, True, False, True, False]
[0, 2, 4, 6, 8]
可以看到加上判断语句的时候,map返回的是bool类型,而filter返回的是我们想要的值,所以我们需要进行筛选的时候,就要用filter函数了!
最后就是累加函数reduce了,在python3中,被放置在functools的模块中。举例说明其用法!
from functools import reduce
lis = reduce(lambda x,y : x*y,range(1,8))
print(lis)
reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
https://www.zhihu.com/question/20125256
https://blog.csdn.net/zjuxsl/article/category/6327387