什么是匿名函数:
#匿名就是没有名字
#定义有名函数
def func(x,y,z=1):
return x+y+z
#定义匿名
lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字
func=lambda x,y,z=1:x+y+z
func(1,2,3)
#让其有名字就没有意义
调用匿名函数
# 方式一:
# res=(lambda x,y:x+y)(1,2)
# print(res)
# 方式二:
# func=lambda x,y:x+y
# res=func(1,2)
# print(res)
有名函数与匿名函数对比
有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能
匿名函数:一次性使用,随时随时定义
应用:max,min,sorted,map,reduce,filter
匿名函数的应用
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
#配合max使用,注意:max和min函数对字典的比较是key
#通过max函数的key参数,改变max函数比较的依据
#max函数会for循环出一个值,值会被传给key指定的函数,调用key指定的函数,拿到返回值作为依据
res=max(salaries,key=lambda k:salaries[k])
print(res) #lili
#配合min使用
res=min(salaries,key=lambda k:salaries[k])
print(res) #jack
#配合sorted使用(默认是升序,)
res=sorted(salaries,key=lambda item:salaries[item]) #升序
print(res) #['jack', 'siry', 'tom', 'lili']
res=sorted(salaries,key=lambda k:salaries[k],reverse=True) #降序
print(res)
======================
#配合map使用
l=['alex','lxx','wxx','薛贤妻']
#new_l=(name+'_dsb' for name in l) #用生成器表达式的方法
#print(new_l)
res=map(lambda name:name+'_dsb',l) #使用map+匿名函数
# print(res) # 生成器
for i in res:
print(i,end=" ") #==》alex_dsb lxx_dsb wxx_dsb 薛贤妻_dsb
#配合filter使用:把符合if条件的打印出来
l=['alex_sb','lxx_sb','wxx','薛贤妻']
res=(name for name in l if name.endswith('sb'))
# print(res)
for i in res:
print(i,end=" ") #alex_sb lxx_sb
res=filter(lambda name:name.endswith('sb'),l)
# print(res)
for i in res:
print(i,end=" ") #alex_sb lxx_sb
#配合reduce使用:reduce函数会对参数序列中元素进行累积
from functools import reduce
res=reduce(lambda x,y:x+y,[1,2,3],10) #10为x的初始值,x=10,y=1,2,3依次相加===》(((10+1)+2)+3)
print(res)
res=reduce(lambda x,y:x+y,['a','b','c']) # abc,如果没有指定,x为列表中第一个元素
print(res)