在该篇章中所写序列代表着 列表 元组 字典 集合
函数名 = lambda 形参 : 返回值
l_fn = lambda x, y: x + y
l_r = l_fn(1, 2) # 3
# 等价于
def l_fn(x, y):
return x + y
l_r = l_fn(1, 2) # 3
l_fn = lambda x, y: x > y
l_r = l_fn(1, 2) # false
可以使用 匿名函数 的 内置函数
- max(xxx, key=fn) -> 求最大值
dic = {'k1': 1, 'k2': 2, 'k3': 3}
max_k = max(dic, key=lambda k: dic[k]) # k3
- min(xxx, key=fn) -> 求最小值
dic = {'k1': 1, 'k2': 2, 'k3': 3}
min_k = min(dic, key=lambda k: dic[k]) # k1
- filter(fn, 序列) -> 过滤器
lis = [1, 2, 3, 4, 5, 6, 7, 8]
n_list = filter(lambda n: n > 5, lis)
print(list(n_list)) # <filter object at 0x0000026337773710>
print(list(n_list)) # [6, 7, 8]
- map(fn, 序列) -> 通过函数的返回值组建新的序列
lis = [1, 2, 3]
n_list = map(lambda n: n + 1, lis)
print(list(n_list))
- sorted(序列, key=fn) -> 排序
# 其实直接 key = len 就可以了,这里只是为了演示 sorted 可以使用匿名函数
lis = ['123', '21', '31']
sort_lis = sorted(lis, key=lambda n: len(n)) # ['21', '31', '123']
面试题 -> 在面试的时候 如果出现了匿名函数的字眼就应该想到 可以使用 匿名函数 的 内置函数
- 现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
lis1 = (('a'), ('b'))
lis2 = (('c'), ('d'))
zip_lis = zip(lis1, lis2)
r_list = map(lambda t: {t[0]: t[1]}, zip_lis)
print(list(r_list)) # [{'a': 'c'}, {'b': 'd'}]
- 以下代码的输出是什么?
# 原码
def multipliers():
return [lambda x: i * x for i in range(4)]
print([m(2) for m in multipliers()]) # [6, 6, 6, 6]
# 拆分后的代码
def multipliers():
return [lambda x: 3 * x, lambda x: 3 * x, lambda x: 3 * x, lambda x: 3 * x] # i = 3 是因为当 m 被调用的时候此时 for 循环已经结束了 i 就等于 3
print([m(2) for m in multipliers()]) # [6, 6, 6, 6]
# 修改后的 multipliers
def multipliers():
return (lambda x: i * x for i in range(4)) # 返回一个迭代器 那么 i 就不是循环的最后一个值了,因为迭代器是被使用了才会执行里面的代码
print([m(2) for m in multipliers()]) # [0, 2, 4, 6]