Python: 高阶函数与Lambda
最后更新:2026-09-22
Python 中函数也是一种"值",可以像数字、字符串一样赋值给变量、传给其他函数。利用这个特性,我们可以写出非常简洁、优雅的代码。高阶函数就是接收函数作为参数或返回函数的函数。这一课会让你打开新世界的大门。
1. 函数是一等公民
在 Python 中,函数可以像普通值一样操作:
▶ 示例:函数作为值传递
▶ 试一试输出:
# 函数定义成功
2. map():批量转换
map() 对序列中的每个元素执行同一个函数,返回一个新迭代器:
▶ 示例:map 批量转换
▶ 试一试输出:
# 执行成功
map()等价于列表推导式:map(f, seq)≈[f(x) for x in seq]。选哪个主要看个人偏好——推导式更"Python 风格"。
3. filter():批量筛选
▶ 示例:filter 筛选数据
▶ 试一试输出:
# 执行成功
filter()也等价于推导式:filter(f, seq)≈[x for x in seq if f(x)]。用 None 作为函数时,等价于去掉所有假值(""、0、None、False等)。
4. sorted() 高阶用法
第 11 课学了 sorted() 的 key 参数,这里更深入地看看:
▶ 示例:sorted 自定义排序
▶ 试一试输出:
# 执行成功
▶ 示例:多级排序(难度⭐⭐)
▶ 试一试运行结果:
Bob: 92
赵六: 92
Charlie: 85
Alice: 85
5. reduce():累积计算
reduce() 把序列中的元素累积起来,每次用函数处理两个元素。它不在内置函数中,需要从 functools 导入:
▶ 示例:reduce 累积计算
▶ 试一试输出:
# 执行成功
(1) reduce() 的执行过程
# reduce(lambda x, y: x + y, [1, 2, 3, 4])
# 第1步:x=1, y=2 → 3
# 第2步:x=3, y=3 → 6
# 第3步:x=6, y=4 → 10
# 结果:10
reduce() vs 循环: 任何 reduce() 能做的事,for 循环也能做。reduce() 的优点是代码更简洁、更"声明式"——你在说"我要做什么"而不是"我要怎么做"。缺点是初次接触的人可能看不懂。
6. Lambda 表达式深入
Lambda 的名字来自 λ(希腊字母),本质就是匿名函数——没有名字、用完就扔的小函数。
(1) Lambda vs 普通函数
▶ 示例:Lambda 对比普通函数
▶ 试一试输出:
# 函数定义成功
(2) Lambda 的完整语法
lambda 参数: 表达式
# ↑ 等价于
def 匿名函数(参数):
return 表达式
(3) 多个参数
▶ 示例:Lambda 多个参数
▶ 试一试输出:
# 执行成功
(4) 什么时候用 Lambda
▶ 示例:Lambda 适用场景
▶ 试一试输出:
# 函数定义成功
7. 常见应用场景
- 数据管道:
map()→filter()→sorted()组合处理数据。 - 自定义排序:用
lambda做key参数实现各种排序规则。 - 事件回调:用函数作为参数传给 GUI 或 Web 框架。
- 闭包工厂:外层函数返回内层函数,实现"参数化"功能(像上面的
create_greeter)。 - 惰性计算:用高阶函数延迟求值,只在需要时才计算结果。
❓ 常见问题
map() 和列表推导式哪个更好?map() 的优势是:① 当你有现成的函数名时更短(map(str.upper, seq) vs [s.upper() for s in seq]);② 返回的是惰性迭代器,大数据量时省内存。多数场景下,列表推导式是更好的选择。📖 小节
- Python 中函数是一等公民——可以赋值、传参、返回
map(f, seq)对每个元素执行函数,list()转为列表filter(f, seq)筛选使函数返回 True 的元素sorted(seq, key=f)的 key 参数接受函数,实现自定义排序reduce(f, seq)累积计算,需要从functools导入- Lambda
lambda 参数: 表达式是匿名单行函数,适合简单场景
📝 作业
-
基础题(难度⭐):给定列表
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],用map()和filter()分别实现:筛选出奇数并计算它们的平方。提示:先用filter筛奇数,再用map平方。 -
进阶题(难度⭐⭐):给定字典列表
products = [{"name": "A", "price": 100}, {"name": "B", "price": 80}, {"name": "C", "price": 120}],用sorted()按价格降序排序,并输出名称和价格。 -
挑战题(难度⭐⭐⭐):用
reduce()实现flatten(nested_list)函数,把嵌套列表"展平"一层。例如flatten([[1, 2], [3, 4], [5]])返回[1, 2, 3, 4, 5]。提示:reduce中每次用+合并两个列表。完成后用列表推导式实现同样的功能,比较两种写法的差异。