Python-匿名函数

先来一个有名函数

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))

 

posted @ 2017-10-18 10:19  大雄猫  阅读(1133)  评论(0编辑  收藏  举报