lambda是Python保留的关键字之一,用于创建一个匿名函数。
lambda与def的区别:
- 1.lambda会返回一个函数对象并执行,但这个函数对象不会被赋给一个标识符,因此lambda创建的匿名函数是不能被其他语句调用的;而def创建的函数是需要先声明函数名然后将函数对象赋给这个函数名,封装之后是可以被多次调用的
- lambda的表达式只允许包含一个简单的表达式,不允许包含其他复杂的语句,但可以调用函数;而def的函数体里面原则上是能包含多个复杂语句,实现多个复杂功能的,但是为了提高模块的内聚性和函数的可读、可重复使用,在定义函数时尽可能遵循一个函数实现一个简单功能的原则。
- if、for、print语句等不能用在lambda中,但可以在def中使用。
语法格式:
lambda的语法格式是唯一规定的:
lambda [arg1[,arg2,arg3,...,argn]]:expression
#支持一个或多个参数,arg参数由用户自定义;expression为执行的功能表达式
这里的参数列表和Python函数定义里面的参数列表是一致的,支持多种格式;而参数在expression表达式中要有定义,并且表达式只能是单行的。
lambda的特点:
1.lambda函数匿名,不能被调用。
2.lambda函数有输入和输出,但其输入输出和作用域是有限定的。
3.函数功能简单,但可以结合其他函数方法一起使用完成比较复杂的功能。
4.lambda表达式并不能提高代码运行的效率,只是使代码更加简洁符合Python语言的特性。
lambda函数示例:
-
lambda x,y:xy;输入是x,y,输出是xy
-
lambda:None;没有输入参数,输出是None
-
lambda *args:sum(args);输入是任意多个参数,输出是输入参数的和
-
lambda **kwargs:True;输入是任意键值对参数,输出是True
常见用法:
lambda语法格式如上述是不变的,但取决于实际应用场景可以和其他函数方法搭配组合使用来实现更高级复杂的功能。
-
可以将定义的lamdba功能函数赋值给一个变量,从而通过这个变量间接调用lambda函数。
-
可以将lambda函数赋给其他函数,将其他函数的功能替换为lambda函数定义的功能。
-
将lambda作为其他函数的返回值,返回给调用者。
-
将lambda函数作为参数传递给其他函数`(即配合其他函数方法使用实现更复杂的功能)。
★filter函数–此时lambda函数用于指定过滤条件。
>>>filter(lambda x:x%3==0,[1,2,3]) #过滤掉列表中能被3整除的数,由lambda指定过滤条件
[1,2]
★sorted函数–此时lambda用于指定排序准则。
>>>sorted([1,2,3,4,5,6,7,8,9],key=lambda x:abs(5-x))
[5,4,6,3,7,2,8,1,9] #按照元素与5的距离从小到大排序
★map函数–此时lambda用于指定对列表中每一个元素的共同操作。
>>>map(lambda x:x+1,[1,2,3])
[2,3,4] #列表中的元素都+1
★reduce函数–此时lambda用于指定列表中两相邻元素的结合条件。
>>>reduce(lambda a,b:'{},{}'.format(a,b),[1,2,3])
'1,2,3' #将列表中的元素从左往右两两以逗号分隔的字符的形式依次结合起来
注意:
1.在使用lambda表达式时应特别注意变量的作用域
>>>r=[]
>>>for x in range(10):
r.append(lambda:x**2)
>>>r[0]()
81
#x是在外部作用域中定义的,对于lambda表达式而言不是局部变量,从而导致了错误
>>>r=[]
>>>for x in range(10):
r.append(lambda n=x:n**2)
#正确的代码书写,充分考虑到了变量的作用域
2.能够用for…in…if完成的坚决不用lambda
3.lambda表达式中不要包含循环,免不了循环的时候选择定义函数来完成。