Day 019 — 练习题与检查表
✅ 完成检查表
- [ ] 理解 Lambda 表达式语法
lambda args: expr - [ ] 掌握
sorted(key=lambda ...)自定义排序 - [ ] 理解
map()及其惰性求值特性 - [ ] 理解
filter()及filter(None, ...)技巧 - [ ] 理解
reduce()归约过程 - [ ] 理解 Late Binding 陷阱及修复方法
- [ ] 理解函数式与命令式风格差异
- [ ] 理解闭包原理与实现
- [ ] 理解装饰器原理
- [ ] 理解偏函数
functools.partial - [ ] 理解函数组合
- [ ] 运行 01-lambda-basics.py
- [ ] 运行 02-functional-data-pipeline.py
- [ ] 运行 03-higher-order-functions.py
📝 练习题
练习 1:Lambda 排序
python
students = [
("Alice", 88, 20),
("Bob", 95, 19),
("Charlie", 88, 22),
("Diana", 95, 18),
("Eve", 88, 20),
]
要求: 1. 按分数降序排列 2. 分数相同则按年龄升序 3. 年龄相同则按名字字母顺序
练习 2:函数式管道
给定一个整数列表,用函数式编程实现: 1. 过滤出所有能被 3 或 5 整除的数 2. 将每个数乘以 10 3. 取前 5 个结果 4. 求和
练习 3:闭包缓存
编写一个 make_cached(func) 函数实现带缓存的函数包装。
练习 4:函数组合
实现 compose_all(*funcs),按顺序组合函数执行。
练习 5:验证装饰器
实现 @validate_args 装饰器,检查函数参数类型。
练习 6:Lambda vs 推导式
比较 Lambda 函数式和列表推导式的代码量和可读性。
练习 7:词频统计
使用函数式编程统计文本中的单词频率。
练习 8:实现自己的 map
python
def my_map(func, iterable):
# 你的实现
练习 9:偏函数应用
使用 functools.partial 创建专用格式化函数。
练习 10:性能测试
比较 for 循环、map/filter/list、列表推导式的性能。
🤔 思考题答案要点
Q1: Late Binding 原因?
Lambda 函数体中的
i是在 调用时 从外层作用域查找的。循环结束后i的值为 2,所以所有 lambda 都返回 2。修复:使用默认参数lambda i=i: i绑定当前值。
Q2: 闭包陷阱
输出
2, 2, 2。同上——捕捉的是变量引用而非值。
Q3: map vs 列表推导
map返回迭代器(惰性),列表推导返回完整列表。大数据集时map节省内存。
Q4: reduce 为何移出?
因为难以阅读。80% 的使用场景可以用
sum()/any()/all()或循环替代。
Q5: 纯函数 vs 不纯函数
纯函数:同样输入永远同样输出、无副作用。
def add(a, b): return a + b。 不纯函数:依赖外部状态或有副作用,如修改全局变量。