文章目录
1、作用
如果函数有一个返回值,并且只有一句代码,那么我们就可以使用lambda进行简化,并且使用lambda可以更加节省内存空间
2、语法
lambda 参数列表: 表达式
注意:
- lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用
- lambda函数能接收任何数量的参数,但只能返回一个表达式的值
- 直接打印lambda表达式,输出的是此lambda的地址值
def fun1():
return 66
print(fun1()) # 输出:66
fun2 = lambda: 66
print(fun2) # 输出:<function <lambda> at 0x000001E3AD927160>
print(fun2()) # 输出:66
3、lambda的参数形式
我们在上面已经说过,函数的参数在lambda中也完全适用,接下来我们逐一介绍
3.1、无参数
print(lambda: 100) # 输出:<function <lambda> at 0x000001A070B563A0>
print((lambda: 100)) # 输出:<function <lambda> at 0x000001A070B563A0>
print((lambda: 100)()) # 输出:100
3.1拓展:lambda参数的调用
接下来我们再看下面的代码
def fun1():
return 66
a = fun1
print(a) # 输出:<function fun1 at 0x000002227DD363A0>
print(fun1) # 输出:<function fun1 at 0x000002227DD363A0>
我们发现,当我们不管是普通的函数还是lambda表达式,我们不加小括号它打印出来的都是这个函数的地址值,因此,如果我们想要得到函数的返回值的话,我们必须对整个lambda表达式后面加一个小括号,也可以将lamda表达式的地址给一个变量,然后将该变量视为函数名,后面再加一个小括号即可
3.2、位置参数
需求1:定义一个函数,依次传入两个整数a和b(保证b不为0),求a和b的余数
def getMod(a, b):
return a % b
print(getMod(10, 3)) # 输出:1
print((lambda a, b: a % b)(0, 3)) # 输出:1
print((lambda a, b: a % b)(3, 0)) # 输出:ZeroDivisionError: integer division or modulo by zero
因此,在使用位置参数的时候,我们需要保证传入的数据和定义的形参的顺序相同,否则可能会得不到正确的结果,其次,我们也发现了lambda函数的确极大的化简了我们的代码,另外,我们可以发现,我们不需要使用函数名也能调用lambda函数,因此,lambda函数也叫做匿名函数
3.3、默认参数(缺省参数)
需求2:定义一个函数,传入的参数的个数可能是4个也可能是5个(使用默认参数的方式传递),返回它们的和
print((lambda a, b, c, d, e=0: a + b + c + d + e)(100, 200, 300, 400)) # 输出:1000
print((lambda a, b, c, d, e=0: a + b + c + d + e)(100, 200, 300, 400, 500)) # 输出:1500
3.4、可变参数
对于需求2,我们用可变参数可以更加简介
fun = lambda *args: sum(args)
print(fun(100, 200, 300, 400)) # 输出:1000
print(fun(100, 200, 300, 400, 500)) # 输出:1500
我们试着直接打印args试一下
print((lambda *args: args)(1)) # 输出:(1,)
print((lambda *args: args)(1, 2)) # 输出:(1, 2)
print((lambda *args: args)(1, 2, 3)) # 输出:(1, 2, 3)
可以发现,当可变参数传入lambda之后,返回的数据类型是元组类型
3.5、关键字参数
print((lambda **kwargs: kwargs)(name="Tom", age=19, gender="男")) # 输出{'name': 'Tom', 'age': 19, 'gender': '男'}
3.6、注意
默认参数一定要在位置参数后面,可变参数一定在默认参数后面,关键字参数必须在可变参数后面
4、lambda的应用
4.1、三目表达式与lambda的运用
需求:定义一个lambda函数,返回两个数之间的最大值
getMax = lambda a, b: a if a > b else b
print(getMax(10, 20)) # 输出:20
print(getMax(40, 20)) # 输出:40
4.2、对元素为字典的列表按key值进行排序
students = [{"name": "Tom", "age": 18, "grade": 97},
{"name": "John", "age": 19, "grade": 99},
{"name": "Anxin", "age": 17, "grade": 95}]
# 按姓名升序排序
students.sort(key=lambda x: x["name"])
print(students)
# [{'name': 'Anxin', 'age': 17, 'grade': 95}, {'name': 'John', 'age': 19, 'grade': 99}, {'name': 'Tom', 'age': 18, 'grade': 97}]
# 按年龄升序排序
lst = sorted(students, key=lambda x: x["age"])
print(lst)
# [{'name': 'Anxin', 'age': 17, 'grade': 95}, {'name': 'Tom', 'age': 18, 'grade': 97}, {'name': 'John', 'age': 19, 'grade': 99}]
# 按成绩降序排序
students.sort(key=lambda x: x["grade"], reverse=True)
print(students)
# [{'name': 'John', 'age': 19, 'grade': 99}, {'name': 'Tom', 'age': 18, 'grade': 97}, {'name': 'Anxin', 'age': 17, 'grade': 95}]
5、总结
在语法中的表达式就是lambda函数的返回值,使用该表达式可以化简我们的代码,节省内存空间