先来一个有名函数
def f1(n): return n**2 f1(3) print(f1) print(f1(3))
匿名函数自带retrun,例如
lambda n:n**2 print(lambda n:n**2) <function <lambda> at 0x100562e18>
小总结,
1 匿名函数即没有绑定名字的函数,没有绑定名字,意味着只能用一次就会被回收 2 所以说匿名函数的应用场景就是:某个功能只用一次就结束了
这里提前介绍下内部函数:
salaries={ 'egon':3000, 'alex':100000000, 'wupeiqi':10000, 'yuanhao':2000 } print(max(salaries)) #默认比较的是key print(max(salaries.values()))
max和for都遵循迭代器协议。
这里提前介绍下拉链函数:
l1=[1,2,3] s1='hello' res=zip(l1,s1) print(res) #后面可接__iter__和__next__,因此也是迭代器 print(list(res)) <zip object at 0x101363d08> [(1, 'h'), (2, 'e'), (3, 'l')]
继续上一个例子(序列类型(带索引)比大小,从第一个值开始比较,比出来即可得出结果):
折中方案:
res=zip(salaries.values(),salaries.keys()) print(max(res)[1]) 把values放在前面,取第二个值(人名)
接下来,max与lambda的结合:
max比较key后面的功能(函数),此处是比较f1的执行结果
salaries={ 'egon':3000, 'alex':100000000, 'wupeiqi':10000, 'yuanhao':2000 } def f1(k): return salaries[k] print(max(salaries,key=lambda k:salaries[k])) #等同于: print(max(salaries,key=f1)
引申如下:
print(min(salaries,key=lambda k:salaries[k])) print(sorted(salaries,key=lambda k:salaries[k])) print(sorted(salaries,key=lambda k:salaries[k],reverse=True)) 按工资排序!
接下来再介绍几个内置函数:map、reduce、filter
l=['alex','wupeiqi','yuanhao','huanghongwei'] print(map(lambda x:x+'_SB',l)) #迭代对象(l)和max相反,放在函数参数后面 print(list(map(lambda x:x+'_SB',l)))
可用于京东购物,推送。
from functools import reduce print(reduce(lambda x,y:x+y,range(1,101))) #1+到100,所以这里是(1,101) print(reduce(lambda x,y:x+y,range(1,101),100)) #后面的100,是以这个数作为初始值,得到的结果为5150 # 此无参函数需要两个参数 # reduce内部机制,先判断有没有初始值,如果没有就先for循环取一个值(1),赋值给初始值,接下来再循环,取值(2); # 这一次3被计算出来了,下一次计算用这个3作为初始值,再for循环取值(3)
l=['alex_SB','wupeiqi_SB','yuuanhao_SB','hhw','egon'] res=filter(lambda name:name.endswith('SB'),l) # 循环后面的l,传给前面的函数,"执行后得到一个bool值",filter把这个函数的结果为trun的情况下那一个迭代的值当成最后的结果,保存在这个结果。 print(list(res))