匿名函数 lambda 的定义和使用
我们前面讲过 Python 中,如果想要使用函数,就必须要先声明再调用,每一个函数都有自己的名字。但是有这么个奇葩的函数,它就是没有名字的,也不要声明,直接就能用。但是想要用好,还是需要一定时间的积累,它就是 lambda 匿名函数。
匿名函数的定义格式: lambda 参数,参数,······:表达式
1.匿名函数由关键字 lambda 修饰;
2.匿名函数冒号 : 之前的是函数的参数,匿名函数可以是无参匿名函数,也可以是带参匿名函数;
3.匿名函数冒号 : 之后是表达式,匿名函数不需要写 return,表达式的结果就是返回值;
代码示例:
# 需求:计算多个值的和
# 常规写法
def num(x,y,j):
sum = x + y + j
return sum
print(num(20,30,40))
# 输出结果:90
# 使用 lambda 匿名函数表达式的写法
sum = lambda x,y,j:x+y+j
print(sum(20,30,40))
# 输出结果:90
# lambda 匿名函数表达式变形
print((lambda x,y,j:x+y+j)(20,30,40))
# 输出结果:90
a = lambda x,y:x+y
b = a(12,14)
print(b)
'''
输出结果
26
'''
# 上面的功能传统函数写法如下
def sum(num1,num2):
result = num1 + num2
return result
a = sum(12,14)
print(a)
优势 : 相对于普通函数,lambda匿名函数比较简洁
缺点 : 只能适用简单的业务场景,复杂的计算没有办法完成
案例示例:
# 需求:对字符串按照空格拆分,合并成一个新的字符串
# 传统写法
# 定义带空格的字符串
str1 = "我是世界上最美丽的人 而且还很有魅力 性感"
# 用空格进行切割字符串str1,输出的是列表,再用join进行拼接成字符串
list1 = str1.split(" ")
# 用join进行拼接成字符串
str2 = "".join(list1)
print(str2)
# 输出结果:我是世界上最美丽的人而且还很有魅力性感
# 变形
# 定义带空格的字符串
str1 = "我是世界上最美丽的人 而且还很有魅力 性感"
print("".join(str1.split(" ")))
# 输出结果:我是世界上最美丽的人而且还很有魅力性感
# 使用 lambda 匿名函数表达式
print((lambda text:"".join(text.split(" ")))(text = "我是世界上最美丽的人 而且还很有魅力 性感"))
# 输出结果:我是世界上最美丽的人而且还很有魅力性感
# 如果想要多次使用lambda 匿名函数表达式
str1 = "我是世界上最美丽的人 而且还很有魅力 性感"
a = lambda text:"".join(text.split(" "))
print(a(str1)
# 输出结果:我是世界上最美丽的人而且还很有魅力性感
匿名函数和普通函数对比之下,匿名函数的使用能让代码更加简洁,当然匿名函数使用场景适用于比较简单的需求,对于复杂的计算,匿名函数是无法完成的;
思考:lambda表达式能否传递可变长参数(*args,kwargs)?**
答:lambda表达式能传递可变长参数
代码示例:
# lambda 表达式传递可变长参数:*args,**kwargs
print((lambda x,y,*args,**kwargs:print(x,y,args,kwargs))(10,20,30,40,50,60,name="美丽",age="18"))
"""
输出结果:
10 20 (30, 40, 50, 60) {'name': '美丽', 'age': '18'}
None
"""
lambda函数当做参数传递
代码示例:
# 将匿名函数当做参数传递
def test(a,b,funct):
result = funct(a,b)
return result
num = test(3,4,lambda x,y:x*y)
print(num)
# 输出结果:12
eval函数
代码示例:
# 提取用户信息
user_input = input("请输入信息:")
print(user_input)
"""
输出结果:
请输入信息:(lambda x,y:x+y)(10,20)
(lambda x,y:x+y)(10,20)
"""
user_input = eval(input("请输入信息:"))
print(user_input)
"""
输出结果:
请输入信息:(lambda x,y:x+y)(10,20)
30
"""
注意:eval函数就是将字符串转换成python表达式,这是很危险的操作,就相当于把自己的服务器开放出去了。不能轻易使用eval函数,否则用户直接输入代码,没有通过审核,直接执行了,那你的服务器估计就会瘫痪了。一般情况下不使用。
升级案例:
'''
需求:比较两个数值的大小,返回较大的值
'''
def compare(a,b):
return a if a > b else b # 返回较大的值
# 定义匿名函数
function0 = lambda b:b*10
# 匿名函数作为参数传递
compare(100,function0(3))
# 上面两行可以简写成一行
print(compare(100,(lambda b:b*10)(3)))
# 输出结果:100
使用匿名函数对列表排序
代码示例:
# 定义列表
test_list0 = [1,43,566,786,34,64,4,345]
# 使用匿名函数对列表排序
# sort 对列表进行升序,从小到大排列
test_list0.sort()
print(test_list0)
# 输出结果:[1, 4, 34, 43, 64, 345, 566, 786]
# reverse 对列表进行降序,从大到小排列
test_list0.reverse()
print(test_list0)
# 输出结果:[786, 566, 345, 64, 43, 34, 4, 1]
案例:用lambda函数对列表中的字典按照age排序
代码示例:
# 定义列表
test_list = [{"name":"老王","age":"60"},{"name":"老李","age":"25"},{"name":"二狗","age":"33"}]
# test_list.sort(reverse=False)
# reverse 是控制升序还是降序的,给个False 就是对列表进行降序
test_list.sort(key=lambda x:x["age"])
# key 是一个参数,是自定义的规则,就是我们按照指定的规则进行排序
# X 就是从列表中取出每一个元素(即每一个字典)
# x["age"]意思就是通过字典的键值“age”,取出value值
# 相当于key=字典里的key值对应的value值,根据value进行排序
print(test_list)
# 输出结果:[{'name': '老李', 'age': '25'}, {'name': '二狗', 'age': '33'}, {'name': '老王', 'age': '60'}]