匿名函数
一、有名函数
之前定的函数都是有名函数,它是基于函数名使用。
def func():
print('from func')
func()
func()
func()
print(func)
from func
from func
from func
<function func at 0x10518b268>
二、匿名函数
匿名函数,他没有绑定名字,使用一次即被收回,加括号既可以运行。
语法:
lambda 参数列表 : 表达式
说明
- 使用lambda关键字创建匿名函数。所谓匿名函数,就是没有名字的函数。
- 匿名函数冒号后面的表达式有且只能有一个,注意:是表达式,而不是语句。
- 匿名函数自带return,而return的结果就是表达式的计算后的结果。
匿名函数调用
步骤一:将创建好的匿名函数通过一个变量来去接收。
步骤二:使用变量再去调用匿名函数。
lambda x, y: x+y
<function main.
res = (lambda x, y: x+y)(1, 2)
print(res)
print((lambda: 1 + 1)())
3
2
三、与内置函数联用
匿名函数通常与max()、sorted()、filter()、sorted()方法联用。
salary_dict = {
'randy': 3000,
'laowang': 100000,
'bar': 5000,
'cheer': 2000
}
3.1 max()
如果我们想从上述字典中取出薪资最高的人,我们可以使用max()方法,但是max()默认比较的是字典的key。
-
首先将可迭代对象变成迭代器对象
-
res=next(迭代器对象),将res当做参数传给key指定的函数,然后将该函数的返回值当做判断依据
def func(k):
return salary_dict[k]
print(f"max(salary_dict, key=func()): {max(salary_dict, key=func)}")
print(
f"max(salary_dict, key=lambda name: salary_dict[name]): {max(salary_dict, key=lambda name: salary_dict[name])}")
max(salary_dict, key=func()): ('laowang', 100000)
max(salary_dict, key=lambda name: salary_dict[name]): ('laowang', 100000)
3.2 sorted() 排序
如果我们想对上述字典中的人,按照薪资从大到小排序,可以使用sorted()方法。
- 首先将可迭代对象变成迭代器对象
- res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值当做判断依据。
lis = [1, 3, 2, 5, 8, 6]
sorted(lis)
print(f"lis: {lis}")
print(f"sorted(lis,reverse=True): {sorted(lis,reverse=True)}")
lis: [1, 3, 2, 5, 8, 6]
sorted(lis,reverse=True): [8, 6, 5, 3, 2, 1]
print(
f"sorted(salary_dict, key=lambda name: salary_dict[name]):
{sorted(salary_dict, key=lambda name: salary_dict[name])}" # 根据value来排序
)
sorted(salary_dict, key=lambda name: salary_dict[name]): ['cheer', 'randy', 'bar', 'laowang']
3.3 map()
如果我们想对一个列表中的工资加薪,可以使用map()方法。
- 首先将可迭代对象变成迭代器对象
- res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值作为map()方法的结果之一。
print(list(map(lambda name: salary_dict[name] + 2000, salary_dict)),11)
[5000, 102000, 7000, 4000]
3.4 filter()
如果我们想筛选除薪资小于5000,我们可以使用filter()方法。
filter()工作原理:
- 首先将可迭代对象变成迭代器对象
- res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下。
print(list(filter(lambda i: i[1] < 5000, salary_list)))
print(list(filter(lambda name: salary_dict[name] < 5000, salary_dict)))
[('randy', 3000), ('cheer', 2000)]
['randy', 'cheer']
四、自定义sorted方法
def sorted(iter, key=None, reverse=None):
iter.sort()
if key:
# key 是一个函数对象
lt = []
lt2 = []
for i in iter:
res = key(i)
lt.append(res)
lt2.append(i)
lt.sort()
lt3 = []
for i in lt:
for j in lt2:
if j[1] == i:
lt3.append(j)
if reverse:
lt3.reverse()
return lt3
if reverse:
iter.reverse()
return iter
salary_list = list(salary_dict.items())
print(salary_list)
print(sorted(salary_list, key=lambda i: i[1], reverse=None))
五、总结
- 匿名函数:****lambda 参数列表 : 表达式,只可使用一次,一般和内置函数一起连用
- max():最大值,其中key参数为函数可以有名函数或匿名函数,都可以使用,key是对匿名函数的结果值获取最大值
- min(): 最小值,其中key参数为函数可以有名函数或匿名函数,都可以使用,key是对匿名函数的结果值获取最小值
- sorted: 排序,其中key参数为函数可以有名函数或匿名函数,都可以使用,key是对匿名函数的结果值进行排序
- **map: **数据统一处理,第一个参数为函数地址,第二个参数为可迭代对象,将匿名函数中表达式处理的结果返回,返回是一个对象需要list转换
- filter: 过滤器, 第一个参数为函数地址,第二个参数为可迭代对象,将匿名函数中表达式过滤满足条件的结果,进行返回返回,返回是一个对象需要list转换