📄 一句话概括
好处能算:手写 CSV 解析 8 行、用 csv 只要 1 行——但最大回报不是省行数,是省掉你没意识到的坑。
📝 本节和前面几节的关系
6.9~6.11 讲完模式与思想,这一节把重用的好处逐条落到能算的数上。
一、少写
实测:手写 CSV 解析 8 行,用 csv.DictReader 1 行。
手写冒泡排序 5 行,用 sorted() 1 行。
行数比是 8 比 1、5 比 1。项目越大,这个比例越可观。
二、少错
那 8 行里最难的两行是【引号里的逗号】和【转义】——自己写十有八九会漏。 这就是重用的最大回报:不是省下的 7 行,是省掉那些你还没意识到的边界。 类库是被成千上万人踩出来的,你踩的那一脚,它多半已经垫平了。
三、好读
sorted(xs) 一句话说明意图;冒泡排序五行说明的是【怎么做】。
意图比过程好读——这是 3.5 讲的【阅读顺序等于执行顺序】的延伸。
所以用现成的还有一个隐性好处:代码在讲业务,不在讲算法。
四、代价:也有三条
依赖:多一个库就多一份版本负担(6.3、6.8)。 黑盒:出问题时你得读别人的源码。 过重:为了一个小功能装一个大库,是另一种浪费。 所以要权衡:省下的时间 > 长期维护成本,才值得。
五、动手 Demo:通过类库和模式发现的重用的好处
同样两件事:手写一遍,再用现成的写一遍。 数行数,再看边缘情况谁处理了。
import csv, io
# 手写 CSV 解析:8 行起步,还没处理引号和转义
# 用 csv.DictReader:1 行
text = "name,price\n笔,5\n本,8\n"
print([r["name"] for r in csv.DictReader(io.StringIO(text))])
print(sorted([3, 1, 2])) # 手写冒泡要 5 行
实跑输出:
--------------------------------------------------------------------
通过类库和模式发现的重用的好处
--------------------------------------------------------------------
好处能算:**自己写要几行,用现成的要几行。**实测两件事:
手写 CSV 解析 8 行
用 csv.DictReader 1 行 → ['笔', '本']
手写冒泡排序 5 行
用 sorted() 1 行 → [1, 2, 3]
手写版跑得对吗? True
好处 怎么量 实测
-------------------------------------------
少写 行数比 8 行 vs 1 行
少错 边界都被踩过 引号/转义已处理
好读 一句顶八句 意图一目了然
**注意第二行**:那 8 行里最难的两行(引号里的逗号、转义)**自己写十有八九会漏。**
**所以重用的最大回报不是省行数,是省掉你没意识到的那些坑。**
实测:手写 CSV 8 行、csv 1 行;手写冒泡 5 行、sorted 1 行。
最大回报不是省行数,是省掉你没意识到的坑(引号里的逗号、转义)——类库是被成千上万人踩出来的。
30 秒实验
- 把你项目里最长的一个手写解析函数,换成标准库,数一数省了几行。
- 反过来找一个【为了小功能装大库】的地方,评估值不值。
常见误区
- 以为重用只省行数。它更省的是没意识到的边界。
- 以为装了库就没有成本。依赖、黑盒、过重,三样都要算。
自测三问(点开对答案)
1. 两件事的实测行数比是多少? —— 手写 CSV 8 行对 csv 1 行;手写冒泡 5 行对 sorted 1 行。 2. 重用的最大回报是什么? —— 不是省行数,是省掉你没意识到的边界(引号里的逗号、转义)——类库被成千上万人踩过。 3. 重用有哪三条代价? —— 依赖(版本负担)、黑盒(要读别人源码)、过重(小功能配大库)。- ☐ 下一节(COLUMN 当今的OOP 因Rails框架而走红的Ruby)
相关笔记
- 标准类库是语言规范的一部分 — 依赖负担的来源
- 重视易懂性的结构化编程 — 意图比过程好读
- 当今的OOP 因Rails框架而走红的Ruby — 另一条复用思路
- 🧩 面向对象是怎样工作的 · 索引