← 返回 Day 19 正文

Day 19 · 练习与清单

Day 019 — 练习题与检查表

✅ 完成检查表


📝 练习题

练习 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。 不纯函数:依赖外部状态或有副作用,如修改全局变量。