四、Python之匿名函数 lambda
匿名函数:就是不用定义函数,便可直接调用。当我们在传入函数时,有些时候,不需要显示的定义函数,直接传入匿名函数更方便。
1. 比较以下2种函数定义及调用方式的不同
1) 有名函数
def func(x,y,z=1):
return x+y+z
print(func(1, 2)) #4=1+2+1 这里z已经默认赋值了,也可以重新定义如下
print(func(1,2,z=3)) #6=1+2+3 默认形参和位置形参可以混用,但是默认参数必须放在位置形成后面
2) 匿名函数
print((lambda x, y, z=1 : x + y + z)(1,2)) #4 与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非给这个表达式重新赋予变量名
res = (lambda x, y, z=1 : x + y + z)(1,2)
print(res) #4 将函数返回结果赋给一个变量,可永久保存
func = lambda x, y, z=1: x + y + z #赋给一个函数名,已经是有名函数,可多次调用但一般不会这么用
print(func(1, 2, 3)) #6
print(func(1,1,1)) #3 可以再次调用
2.与lambda一起使用的函数(max,min,sorted,map,reduce,filter)
1) max 和 lambda
salaries={
'ee':3000,
'aa':100000000,
'ww':10000,
'yy':2000
}
g = zip(salaries.values(),salaries.keys())
print(list(g))
print(max(g))
#method2
def func(k):
return(salaries[k])
print(max(salaries,key=func))
print(max(salaries,key= lambda k:salaries[k]))
2) sorted 和lambda
print(sorted(salaries,key= lambda k:salaries[k],reverse=True))
3) map 和 lambda
names = ['aa','ww','yy']
l=[name + '_sb' for name in names]
print(l)
g = map(lambda name:'%s_Sb' %name,names) #生成器
4) filter 和 lambda
g = filter(lambda x:x.endswith('x'),names)
print(next(g))
print(list(g))
5) reduce 和 lambda
from functools import reduce
res = reduce(lambda x,y:x+y,range(1,100)) #不设置默认初始值是0
res1 = reduce(lambda x,y:x+y,range(1,100),100) #初始值是100
print(res,res1)