摘要:lambda 是 Python 中用于创建匿名函数的语法,常与高阶函数配合使用,从而写出紧凑、表达力强的代码。典型应用场景包括:数据映射、条件过滤、归约操作、自定义排序、动态函数生成等。
lambda 是 Python 中用于创建匿名函数的语法,常与高阶函数配合使用,从而写出紧凑、表达力强的代码。典型应用场景包括:数据映射、条件过滤、归约操作、自定义排序、动态函数生成等。
一、lambda 与高阶函数
在 Python 中,高阶函数(Higher-Order Function)是指至少满足以下两点之一的函数:
(1)接受一个或多个函数作为参数。
(2)返回一个函数作为结果。
由于 lambda 本质上是一个函数对象,自然可以作为高阶函数的参数或返回值。
1、lambda 作为函数的参数
示例 1:作为普通函数的参数
def apply_twice(func, x):return func(func(x))print(apply_twice(lambda x: x + 1, 3))# 输出: 5 (3 先加 1 得 4,再加 1 得 5)示例 2:嵌套 lambda(返回函数的函数)
adder = lambda x: lambda y: x + yadd5 = adder(5)print(add5(3)) # 输出: 8 (先固定 x=5,得到一个新函数,再传入 y=3)提示:
当逻辑简单、一次性使用时可用 lambda;若逻辑复杂,优先 def 定义函数。
2、lambda 作为函数的返回值
示例:构造加法器
# make_adder 返回一个新函数def make_adder(n):return lambda x: x + nadd5 = make_adder(5)print(add5(3)) # 输出: 8# 这里的 lambda 引用了外层参数 n,形成闭包这里的 lambda 引用了外层函数的参数 n,形成了一个带记忆功能的函数。
提示:
闭包场景下 lambda 能快速生成带状态的函数,但若函数需要复用,应命名并写注释。
二、lambda 在高阶函数的应用
1、元素逐个映射
将函数 func 作用于可迭代对象中的每个元素,返回一个新迭代器。
示例 1:将字符串列表转为长度列表
names = ["Alice", "Bob", "Clara"]lengths = list(map(lambda s: len(s), names))print(lengths) # 输出: [5, 3, 5]示例 2:逐元素相加(以较短序列为准)
a, b = [1, 2, 3], [10, 20, 30, 40]sums = list(map(lambda x, y: x + y, a, b))print(sums) # 输出: [11, 22, 33]提示:
能用列表/生成器推导式时优先使用推导式,提升可读性。
2、条件过滤
会保留所有 func(x) 为 True 的元素。
示例:过滤出偶数
nums = [1, 2, 3, 4, 5, 6]evens = list(filter(lambda x: x % 2 == 0, nums))print(evens) # 输出: [2, 4, 6]类似功能推荐使用。
evens2 = [x for x in nums if x % 2 == 0]提示:
用推导式 [...] if ... 更直观,filter 适合与已有函数搭配使用。
3、累积归约
会将函数 func 依次作用于序列元素,最终归约成一个值。
示例:累乘
from functools import reduce# 将序列 [2, 3, 4] 累乘,初始值为 1product = reduce(lambda acc, x: acc * x, [2, 3, 4], 1)print(product) # 24这里的 acc 表示累计结果,每一步会被传入下一次计算。
更推荐使用内置函数:
import mathprint(math.prod([2, 3, 4])) # 输出: 24提示:
能用 、 时尽量不用 reduce,除非逻辑确实需要自定义归约。
4、自定义排序
通过 key 指定排序逻辑。
示例:按分数排序
students = [{"name": "Alice", "score": 85},{"name": "Bob", "score": 72},{"name": "Clara", "score": 91},]# 按成绩排序(升序)sorted_students = sorted(students, key=lambda s: s["score"])print(sorted_students)# [{'name': 'Bob', 'score': 72}, {'name': 'Alice', 'score': 85}, {'name': 'Clara', 'score': 91}]对比 operator.itemgetter:
from operator import itemgetterprint(sorted(students, key=itemgetter("score")))提示:
简单字段排序用 itemgetter 更直观,多条件排序用 lambda。
5、选择最值
和 也支持 key 参数。
示例:找到成绩最高和最低的学生。
# 找到成绩最高和最低的学生best = max(students, key=lambda s: s["score"])worst = min(students, key=lambda s: s["score"])print(best) # {'name': 'Clara', 'score': 91}print(worst) # {'name': 'Bob', 'score': 72}6、动态函数生成
可用 lambda 或 partial 动态返回函数。
示例 1:用 lambda 定义简单平方函数
square1 = lambda x: x ** 2print(square1(5)) # 输出: 25示例 2:用 .partial 固定参数,得到一个“平方函数”
from functools import partialpower = lambda x, n: x ** nsquare2 = partial(power, n=2)print(square2(5)) # 25三、进阶技巧与注意事项
1、闭包与状态保存
示例:返回一个带状态的乘法器
def make_multiplier(n):return lambda x: x * ntimes3 = make_multiplier(3)print(times3(10)) # 30提示:
lambda + 可快速生成“定制函数”,适合轻量场景。
2、多关键字排序
示例:先按分数升序,再按年龄降序
students = [{"name": "Alice", "score": 85, "age": 20},{"name": "Bob", "score": 85, "age": 22},{"name": "Clara", "score": 91, "age": 19},]ranked = sorted(students, key=lambda s: (s["score"], -s["age"]))print(ranked)提示:
用元组 (主键, 次键, …) 实现多条件排序,比写嵌套 if-else 更简洁。
3、循环中的延迟绑定陷阱
错误示例:所有 lambda 都捕获了同一个 i
funcs = [lambda: i for i in range(3)]print([f for f in funcs]) # [2, 2, 2]正确示例:用默认参数捕获当前值
funcs = [lambda i=i: i for i in range(3)]print([f for f in funcs]) # [0, 1, 2]提示:
循环中定义 lambda 时,用默认参数绑定当前值。
小结
lambda 表达式在高阶函数中的典型应用包括:
map:逐个元素映射
filter:条件过滤
reduce:累积归约
sorted:自定义排序
min / max:条件选择
partial:函数生成
它让代码更紧凑、灵活,是 Python 函数式编程的重要一环。但在实际项目中,应结合可读性与可维护性,避免过度使用 lambda。
“点赞有美意,赞赏是鼓励”
来源:笑怡教育分享