lambda 是 Python 中用于创建匿名函数的语法,常与高阶函数配合使用,从而写出紧凑、表达力强的代码。典型应用场景包括:数据映射、条件过滤、归约操作、自定义排序、动态函数生成等。
在 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 + y
add5 = adder(5)
print(add5(3))
# 输出: 8 (先固定 x=5,得到一个新函数,再传入 y=3)提示:
当逻辑简单、一次性使用时可用 lambda;若逻辑复杂,优先 def 定义函数。
2、lambda 作为函数的返回值
示例:构造加法器
# make_adder 返回一个新函数
def make_adder(n):
return lambda x: x + n
add5 = 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] 累乘,初始值为 1
product = reduce(lambda acc, x: acc * x, [2, 3, 4], 1)
print(product) # 24这里的 acc 表示累计结果,每一步会被传入下一次计算。
更推荐使用内置函数:
import math
print(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 itemgetter
print(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 ** 2
print(square1(5)) # 输出: 25示例 2:用 .partial 固定参数,得到一个“平方函数”
from functools import partial
power = lambda x, n: x ** n
square2 = partial(power, n=2)
print(square2(5)) # 25三、进阶技巧与注意事项
1、闭包与状态保存
示例:返回一个带状态的乘法器
def make_multiplier(n):
return lambda x: x * n
times3 = 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。
“点赞有美意,赞赏是鼓励”
热门跟贴