Python: 高阶函数与Lambda

最后更新:2026-09-22

Python 中函数也是一种"值",可以像数字、字符串一样赋值给变量、传给其他函数。利用这个特性,我们可以写出非常简洁、优雅的代码。高阶函数就是接收函数作为参数或返回函数的函数。这一课会让你打开新世界的大门。


相关内置函数:filter() sorted() list() lambda map() max() sum() False True None

1. 函数是一等公民

在 Python 中,函数可以像普通值一样操作:

▶ 示例:函数作为值传递

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功
💡 "函数是一等公民"是什么意思? 就是说函数和整数、字符串、列表是同一等级的,可以做一样的事:赋值给变量、放进列表、作为参数传递、作为返回值。这种编程范式叫"函数式编程"。



2. map():批量转换

map() 对序列中的每个元素执行同一个函数,返回一个新迭代器:

▶ 示例:map 批量转换

▶ 试一试

输出:

TEXT 📖 仅展示
# 执行成功

map() 等价于列表推导式: map(f, seq) ≈ [f(x) for x in seq]。选哪个主要看个人偏好——推导式更"Python 风格"。



3. filter():批量筛选

filter() 筛选出使函数返回 True 的元素:

▶ 示例:filter 筛选数据

▶ 试一试

输出:

TEXT 📖 仅展示
# 执行成功

filter() 也等价于推导式: filter(f, seq) ≈ [x for x in seq if f(x)]。用 None 作为函数时,等价于去掉所有假值(""、0、None、False 等)。



4. sorted() 高阶用法

第 11 课学了 sorted() 的 key 参数,这里更深入地看看:

▶ 示例:sorted 自定义排序

▶ 试一试

输出:

TEXT 📖 仅展示
# 执行成功

▶ 示例:多级排序(难度⭐⭐)

▶ 试一试

运行结果:

TEXT 📖 仅展示
Bob: 92
赵六: 92
Charlie: 85
Alice: 85


5. reduce():累积计算

reduce() 把序列中的元素累积起来,每次用函数处理两个元素。它不在内置函数中,需要从 functools 导入:

▶ 示例:reduce 累积计算

▶ 试一试

输出:

TEXT 📖 仅展示
# 执行成功

(1) reduce() 的执行过程

PYTHON
# 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 对比普通函数

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功

(2) Lambda 的完整语法

PYTHON
lambda 参数: 表达式
# ↑ 等价于
def 匿名函数(参数):
    return 表达式

(3) 多个参数

▶ 示例:Lambda 多个参数

▶ 试一试

输出:

TEXT 📖 仅展示
# 执行成功

(4) 什么时候用 Lambda

▶ 示例:Lambda 适用场景

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功
💡 Lambda 的适用原则: 如果逻辑需要写超过一行表达式,或者需要 if-elif 多分支,就别用 lambda 了——写普通函数更清晰。Lambda 的优雅在于"极简"。



7. 常见应用场景


相关内置函数:filter() sorted() list() lambda map() max() sum() False True None

❓ 常见问题

Q map() 和列表推导式哪个更好?
A Python 社区更偏好列表推导式——更直观、更 Pythonic。map() 的优势是:① 当你有现成的函数名时更短(map(str.upper, seq) vs [s.upper() for s in seq]);② 返回的是惰性迭代器,大数据量时省内存。多数场景下,列表推导式是更好的选择。
Q Lambda 能不能写多行?
A 不能。Lambda 的语法限制它只能写单行表达式。需要多行逻辑时,定义普通函数。Python 的 lambda 比其他语言(如 JavaScript)的功能弱很多——这是故意的,因为 Guido(Python 之父)认为"显式优于隐式"。
Q reduce() 在现代 Python 中还用吗?
A 用得不多。Guido 本人不太喜欢 reduce(),认为它太难理解。大多数 reduce() 的场景可以用循环替代,或者有更直接的函数(如 sum()、max())。不过在函数式编程中,reduce() 仍然是一个重要的概念。

📖 小节


📝 作业

  1. 基础题(难度⭐):给定列表 nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],用 map() 和 filter() 分别实现:筛选出奇数并计算它们的平方。提示:先用 filter 筛奇数,再用 map 平方。

  2. 进阶题(难度⭐⭐):给定字典列表 products = [{"name": "A", "price": 100}, {"name": "B", "price": 80}, {"name": "C", "price": 120}],用 sorted() 按价格降序排序,并输出名称和价格。

  3. 挑战题(难度⭐⭐⭐):用 reduce() 实现 flatten(nested_list) 函数,把嵌套列表"展平"一层。例如 flatten([[1, 2], [3, 4], [5]]) 返回 [1, 2, 3, 4, 5]。提示:reduce 中每次用 + 合并两个列表。完成后用列表推导式实现同样的功能,比较两种写法的差异。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏