定义
在Python中,lambda的语法是唯一的。其形式如下:
lambda argument_list: expression
其中,lambda是Python预留的关键字,argument_list和expression由用户自定义。具体介绍如下。
- argument_list 这里的argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的。具体来说,argument_list可以有非常多的形式。例如:
- a,b
- a=1,b=2
- *args
- **kwargs
- a,b=1,*args
- 空
- …..
- expression:是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。以下都是合法的表达式:
- 匿名的 ,lambda是没有名字的函数
- 有输入输出,输入是传入到参数列表argument_list的值,输出是根据 expression计算得到的值
- 功能简单, 单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明
函数示例:
- lambda x, y: xy;函数输入是x和y,输出是它们的积xy
- lambda:None;函数没有输入参数,输出是None
- lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
- lambda **kwargs: 1;输入是任意键值对参数,输出是1
用法
由于lambda语法是固定的,其本质上只有一种用法,那就是定义一个lambda函数。在实际中,根据这个lambda函数应用场景的不同,可以将lambda函数的用法扩展为以下几种
将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数
add = lambda x,y:x+y
add(1,2)
>>3
将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换
import time
time.sleep = lambda x:None
time.sleep(3)
>>程序不休眠
将lambda函数作为其他函数的返回值,返回给调用者
函数的返回值也可以是函数。例如return lambda x, y: x+y返回一个加法函数。这时,lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。对应的,将包含嵌套函数的函数称之为外部函数。内部函数能够访问外部函数的局部变量
- 将lambda函数作为参数传递给其他函数
- filter函数
filter(object,iterable)
这里的object必须是一个返回布尔值的lambda函数。对迭代器中的每一项都会调用该函数来计算其结果是True或False。请注意,本函数只能接受一个迭代器作为输入
numbers_list =[2,6,8,10,11,4,12,7,13,17,0,3,21]
filtered_list = list(filter(lambda num:(num > 7),numbers_list))
print(filtered_list)
>>>[8, 10, 11, 12, 13, 17, 21]
- sorted函数
sorted(iterable,key=object,reverse =False)
number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
sorted_list = sorted(number_list,key=lambda x:abs[5-x],reverse=False)
print(sorted_list)
>>>>[5, 4, 6, 3, 7, 2, 8, 1, 9]
- map函数
map(object,iterable1,iterable2,…. )
传入map()函数的迭代器可以是字典,列表等。map()函数主要是根据lambda函数定义的逻辑来将输入迭代器中的每一项映射到输出迭代器中的相关项。请参考以下的例子:
numbers_list =[2,6,8,10,11,4,12,7,13,17,0,3,21]
mapped_list = list(map(lambda num: num %2,numbers_list))
print(mapped_list)
>>>[0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1]
- reduce函数
reduce(object,iterable)
number_list = [ i for i range(10) ]
result = reduce(lambda a,b:'{},{}'.format(a,b),number_list)
print(result)
>>>'1, 2, 3, 4, 5, 6, 7, 8, 9'