匿名函数 lambda
为什么有 lambda 匿名函数
- 在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便
- Python 提供了 lambda 表达式对匿名函数提供支持
lambda 表达式的语法
lambda args: expression
expression 只允许是一条表达式,所以使用很受限
lambda 表达式小栗子
lambda x:x>2
等价函数写法
def select_positive(x):
return x > 0
使用 lambda 表达式重写上面的将函数作为参数传递
def test(list, select_fun): for item in list: if select_fun(item): print(item) list = [1, -1, 2, -2, 3, -3] test(list, lambda x: x > 0) test(list, lambda x: x < 0) # 输出结果 1 2 3 -1 -2 -3
map 函数
使用 Python 内置的 map 函数时,通常会用到 lambda 表达式
函数语法
map(function, list)
- map 函数接收两个参数 function 和 list
- function 是一个函数,list 是一个可以被遍历的序列
- map 将传入的函数依次作用到序列的每个元素,并把结果作为新的序列返回
map 函数原理
- 图的左边是一个序列 list,包含 3 个元素 1、2、3
- 调用函数 map 时,需要提供一个函数 y = f (x),函数 f 将输入 x 映射为输出 y
- 将函数 f 对图的左边的序列中的每个元素依次作用,得到图的右边的序列
- 图的右边是一个序列 list,包含 3 个元素 f (1)、f (2)、f (3)
非 lambda 的写法
list = [1, 2, 3] def test(x): x += 5 return x list1 = map(test, list) for i in list1: print(i) # 输出结果 6 7 8
lambda 的写法
list = [1, 2, 3] list1 = map(lambda x: x + 5, list) for i in list1: print(i) # 输出结果 6 7 8
lambda 表达式栗子一:将 lambda 赋值给变量
- 将 lambda 表达式赋值给一个变量
- 这样调用这个变量,相当于调用了一个函数
f = lambda a, b: a if a > b else b print(f(1, 2)) # 输出结果 2 # lambda 表达式等价写法 def test(a, b): if a > b: return a else: return b
lambda 表达式栗子二:将 lambda 作为函数参数传递
f = lambda x: x if x > 0 else 0 def test(f, x): if f(x): print("正数") else: print("负数") test(f, 1) test(f, -1) # 输出结果 正数 负数 # lambda 表达式等价写法 def func(x): if x > 0: return x else: return 0
lambda 表达式栗子三:将 lambda 作为函数返回值
f = lambda a, b, c: a * b * c def test(a, b, c): a += 1 b += 2 c += 3 return f(a, b, c) print(test(1, 2, 3)) # 输出结果 48 # 等价写法 def test(a, b, c): return a * b * c
Python 内置函数接受函数作为参数
- filter(function, iterable):用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
- sorted(iterable, cmp=None, key=None, reverse=False):对所有可迭代的对象进行排序操作
- map(function, iterable, ...):根据提供的函数对指定序列做映射
- reduce(function, iterable[, initializer]):会对参数序列中元素进行累积
后面再详说这些函数
总结
lambda 表达式常用场景:当某些功能代码只用一次的时候,可以用 lambda 代替