在该篇章中所写序列代表着 列表 元组 字典 集合

函数名 = 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]