缘由
lambda这个关键字来自于LISP语言中一个类似的lambda calculus工具。同def创建一个之后能调用的函数,但不同点是lambda返回函数,def赋值一个变量名。由于没有函数的变量名,所有lambda被叫做匿名函数。
表达式
Lambda arrgument1, argument2,..., argumentN : expression using arguments
In [1]: f = lambda x, y: x+y
In [2]: f(2,3)
Out[2]: 5
结构特点:lambda主体是一个单个表达式,而不是一个代码块。
结构简单得如同只有return主体的def一样。但是lambda能够出现在def不允许出现的地方,比如列表常量或者函数调用的参数中。
为什么使用lambda
简单来说就是为简化单行代码函数,一般只会调用一次的函数,可以省去编写函数名。
In [3]: L =[lambda x:x**2, lambda x:x**3, lambda x:x**4]
In [4]: for f in L:
...: print(f(2))
...:
4
8
16
与迭代函数组合
可迭代函数就是一种有循环迭代功能的内置函数, 包括reduce 、map 和filter 等。在每个可迭代函数中都需要指定一个处理函数, 习惯上使用匿名函数作为处理函数。
与reduce函数组合
reduce本质可看作一个内嵌循环的函数
reduce(function, sequence, [initial])
function: 回调函数
sequence:一个“序列”类型的数据
按照sequence序列中元素顺序,依次调用函数function。每次调用传入两个参数:一个是sequence序列中当前元素,另一个是sequence序列中上一个元素在function中的返回值。
In [5]: from functools import reduce
In [6]: print(reduce(lambda x, y: x+y, range(1, 101)))
5050
与map函数组合
map(function, sequence)
function: 回调函数
sequence:一个“序列”类型的数据
将参数sequence内部的元素作为参数,按照sequence序列的顺序,以此调用回调函数function
In [7]: t = map(lambda x:x**2, [1,2,3,4,5])
In [9]: print(list(t))
[1, 4, 9, 16, 25]
多个sequence时,对应lambda中的参数个数
In [11]: t = map(lambda x,y: x+y, [1 , 2, 3, 4, 5], [ 2, 4, 5, 6, 7])
In [12]: print(list(t))
[3, 6, 8, 10, 12]
与filter函数组合
filter 函数的功能是对指定序列进行过滤
filter(function or None, sequence)
function: filter的处理函数,返回布尔型,表示sequnce是否保留
sequence: 一个或多个待过滤的序列
In [14]: t=filter (lambda x:x%2==0, [1, 2 , 3, 4, 5, 6, 7, 8, 9,10])
In [15]: print(list(t))
[2, 4, 6, 8, 10]
参考
《python 学习手册》19和20章