lambda表达式:匿名函数,它与显式函数def不一样,实质上可以当做一个表达式。
它是为处理简单的函数而出现的,其参数可选,返回对象,可以被def嵌套使用。
1. 作为表达式
# 1. 作为表达式 add_func = lambda x,y : x+y # x,y相当于传参,x+y属于函数体,返回的值就是x+y的结果 aa = add_func(1,2) print(aa) #输出为3 bb = add_func('who are ','you?') print(bb) #输出:who are you?
2. 作为函数的嵌套部分
# 2. 函数嵌套得到表达式 def get_line(a,b): return lambda x : a*x+b y = get_line(1,1) #此时y是一个函数 y=ax+b print(y(3)) # 输出为4
3. 不带参数的函数
ss = lambda:'where are you come from?' print(ss()) #不带参数调用,输出为:where are you come from?
4. 用于选择函数
list_func = [lambda x:x+10, lambda y:y+100, lambda z:z+1000] #其中的每个元素都是一个小函数,可以随时调用 ff_result = [] for ff in list_func: ff_result.append(ff(1000)) print(ff_result) #输出:[1010, 1100, 2000]
5. lambda表达式作为参数:max函数与lambda表达式操作字典
aa = {'s1':34,'s2':50} kk = lambda x: aa[x] # 因为此时相当于定义了一个kk(x)函数,且x的取值范围是aa的键,其他的x会报错 max_item = max(aa, key=kk) # 当然这里的key=kk中,kk也可以用其他函数代替,都是对前面的参数aa进行操作,aa传入的是键 print(max_item) # max此时表示,先代入aa计算kk(x)的值,然后比较,得到函数值最大的aa的键,其实也就是kk(x)中的x # 所以可以用这个函数,加上max来实现求取经过函数后的最大值所对应的自变量x,类似argmax的功能
为什么?个人觉得:函数式编程中,字典作为可迭代参数传入的是键,而不是键值对。
aa = {'s1':34,'s2':50} mm = lambda x: x s = map(mm, aa) print(list(s))
for ii in aa: print(ii) #字典作为可迭代容器时
6. lambda表达式:max函数与lambda表达式操作列表
bb = ['s','open','what'] ff = lambda y: bb[y] # 一定要注意 lambda传入的参数是什么 max_elem = max(range(len(bb)), key=ff) #求取列表bb中最大值对应的索引 print(max_elem)
7. lambda表达式可用其他函数代替
# 当然,lambda表达式可以用函数来代替 def get_value(z): return bb[z] #全局作用域 max_elem_2 = max(range(len(bb)), key=get_value) #求取列表bb中最大值对应的索引 print(max_elem_2)
特点:
# 1. 简洁
# 2. 在不复杂的函数中,lambda能提高性能
# 3. lambda拥有自己的命名空间,除了自己的参数之外,不能访问其他参数
# 更pythonic的用法在 map、reduce、filter、sorted等函数式编程的函数中,因为它们都支持函数作为参数
参考: