选工具的顺序是反的:先看手头有什么,再找现成的,最后才从零写。 工具给的是能力,技能给的是经验。这两样混起来说,就会写出「把代码抄进说明书」的技能。 这一篇在一台真机器上盘了一遍现成工具,同一个活用三种写法各跑一次。
前两篇定了「做不做」和「谁来做」,这一篇定「用什么做」。 它看起来是最琐碎的一篇,实际上决定了技能的可移植性——依赖越多,别人越装不上。 第 6 章讲设计时会用到这里的结论:可扩展的前提是依赖少。
一、先看手头有什么
写技能之前,先花两分钟盘一下这台机器上已经有什么。 Python 的标准库能覆盖大半日常:csv、json、re、sqlite3、statistics、datetime。 已经装好的命令行工具:git、node、python 自带的那一堆。 这些东西不用装、不用配、不会因为版本升级突然消失。 盘它的意义在于:很多人在装第三方库之前,压根没查过标准库有没有。 结果装了 pandas 只为算一个平均值,装了 requests 只为下一次 GET。 技能是要发给别人的。你多装一个库,别人就多一道门槛。
二、别从零写,现成的库多的是
要写的东西,九成已经有人写过。这不是偷懒,是常识。 但「现成」有三个层次,先进哪个有讲究。 第一层,标准库。零成本、零依赖、随 Python 走。 第二层,命令行工具。git 能做的事,别用 Python 再写一遍。 第三层,第三方库。功能强、接口好,但要装。「要装」本身就是成本。 顺序反了会怎样?先装库,再发现标准库早就能做——白背一个依赖,还要跟别人的环境对齐。 一个技能装三个库,就等于要求用它的人先配好这三个库。这个门槛会劝退大部分人。
三、引入第三方库的四个判断
也不是一律不装。四条判断,从上往下走。 标准库能做 → 别装。少一个依赖,少一个将来坏掉的地方。 标准库能做但很别扭 → 看情况。别扭到每次都要查文档,就装。 标准库做不了 → 装。画图、解析复杂格式、跑机器学习,这些确实做不了。 只有一个函数要用 → 别装。把那一个函数抄进来,比装一个库划算,而且不会因为那个库改版而坏。 第三条最容易被滥用。「标准库做不了」是真的做不了,不是「做起来麻烦」。 麻烦和做不了是两件事。麻烦可以忍,做不了才该装。
四、工具给能力,技能给经验
这一节是全篇的核心:工具和技能到底分什么。 工具回答「能做什么」:能不能读文件、能不能发请求、能不能画图。 技能回答「该怎么做」:先读什么、什么情况下换个做法、什么不许做。 「用 pandas 算环比」——pandas 是工具,「环比要跟上月比、跌了要单独标出来」是技能。 换一个工具,能力变了;换一个技能,还是同一批工具,只是路径变了。 所以技能正文里最该写的不是「用什么库」,是「什么顺序、什么条件下换一种做法」。 写「用 pandas 读 CSV」,等于把工具绑死在技能里——换个环境没有 pandas,技能就废了。 写「读 CSV 得到月份与金额两列,读不出来就报错停下」,这才是技能该写的东西。
五、动手 Demo:选手头的工具之前,先看看手头有什么
这一段先盘这台机器上现成的东西,再拿同一个活(按品类求和)用三种写法各跑一次。 三种写法都真跑,比的是行数、输出、以及「下一步要不要换工具」。
# 同一个活,三种写法
# 1. 纯 split:零依赖
# 2. csv 模块:标准库,省掉切分与去空行
# 3. sqlite3:标准库,适合筛选排序连接
for name, code in V:
put(root, fn, code); run(root, [PY, fn]) # 三个都真跑
实跑输出:
--------------------------------------------------------------------
选手头的工具之前,先看看手头有什么
--------------------------------------------------------------------
① 这台机器上现成的东西
--------------------------------------------------------------------
| 工具 | 在不在 | 版本 |
|---|---|---|
| git | 有 | git version 2.55.0.windows.3 |
| node | 有 | v22.22.2 |
| python | 有 | Python 3.13.14 |
| sqlite3(模块) | 有 | 3.53.1 |
「先看手头有什么」的意思是:这些已经装好的,别再去找第三方库。
② 同一个活,三种写法都真跑一遍
--------------------------------------------------------------------
| 写法 | 行数 | 跑通 | 输出 |
|---:|---|:---:|---|
| 纯 split | 7 | ok | {'手机': 218000, '配件': 58000} |
| csv 模块 | 5 | ok | {'手机': 218000, '配件': 58000} |
| sqlite3 当计算器 | 8 | ok | 手机 218000 配件 58000 |
三种写法跑出来的数字完全一致,只是格式不同。
行数差不了几行,真正的差别在「下一步要干什么」。
只是分组求和,csv 模块那份最短,因为它省掉了切分和去空行。
要筛选、排序、多表连接,sqlite3 省一大截——那时候手写就是自找麻烦。
! 选工具的标准不是「先进」,是「下一步要做什么」。
③ 什么时候值得引入第三方库
--------------------------------------------------------------------
| 情况 | 结论 | 理由 |
|---|---|---|
| 标准库能做 | 别装 | 少一个依赖,少一个将来坏掉的地方 |
| 标准库能做但很别扭 | 看情况 | 别扭到每次都要查文档,就装 |
| 标准库做不了 | 装 | 例如画图、解析复杂格式 |
| 只有一个函数要用 | 别装 | 把那一个函数抄进来,比装一个库划算 |
技能是要发给别人的。依赖越多,别人装起来的门槛越高。
! 一个技能装三个库,就等于要求用的人先配好这三个库。
④ 工具和技能的分界
--------------------------------------------------------------------
| 东西 | 回答什么 | 形态 | 换了会怎样 |
|---|---|---|---|
| 工具 | 能做什么 | 函数、命令、库 | 换一个就换了一种能力 |
| 技能 | 该怎么做 | 文本、步骤、边界 | 换一个还是同一批工具 |
「用 pandas 算环比」——pandas 是工具,「环比要跟上月比、跌了要单独标出来」是技能。
技能的价值在于把一堆工具的用法固定成一条路径。
! 所以技能里最该写的不是「用什么库」,是「什么顺序、什么条件下换一种做法」。
⑤ 别从零写:现成的在哪
--------------------------------------------------------------------
先翻标准库。csv、json、re、sqlite3、statistics、datetime,这六个能覆盖大半日常。
再翻已经装在机器上的命令行工具。git、node、python 自带的那一堆。
最后才去装第三方库,而且优先选「只依赖标准库」的那种。
顺序反了会怎样?先装库,再发现标准库早就能做,白背一个依赖。
技能里写死一个第三方库,将来那个库改名或停更,你的技能就跟着坏。
第一段盘了四样:git、node、python、sqlite3 模块,全都在,版本也记了。 这一段的重点不是「有什么」,是「这些已经装好的,别再去找第三方库」。 第二段三种写法都真跑:纯 split 7 行、csv 5 行、sqlite3 8 行,数字完全一致。 行数差不了几行,真正的差别在「下一步要干什么」:只是分组求和,csv 那份最短; 要筛选排序多表连接,sqlite3 省一大截。 第三段是引入第三方库的四条判断,核心是分清「做不了」和「做起来麻烦」。 第四段是工具与技能的分界:工具答「能做什么」,技能答「该怎么做」。 第五段给顺序:先翻标准库,再翻已有的命令行工具,最后才装。
30 秒实验
- 把你技能里用到的库列一遍,逐个查标准库能不能替。能替的换掉,依赖就少一个。
- 找一个「为了一个函数装了一个库」的地方,把那个函数抄进技能自己的脚本里。
- 把你技能正文里所有「用什么库」的句子划掉,改成「要得到什么结果」。划完读一遍,更清楚了。
常见误区
- 为了一个函数装一个大库。 装的时候方便,别人用的时候就是一道门槛,而且那个库一改版,你的技能就跟着坏。
- 把工具名写进技能正文。「用 pandas 读」,换个环境没有 pandas 就废了。 写「读 CSV 得到两列」,才是技能该说的话。
- 先装库再想办法。 顺序反了就会出现「为了用这个库硬设计一个流程」,而不是「为了这个流程找一个合适的工具」。
自测三问(点开对答案)
1. 选工具的正确顺序是什么? —— 先看手头有什么,再找现成的(标准库、命令行),最后才装第三方库。 2. 「标准库做不了」和「标准库做起来麻烦」有什么区别? —— 麻烦可以忍,做不了才该装。把「麻烦」当成「做不了」,是依赖膨胀的主因。 3. 工具和技能各回答什么问题? —— 工具答「能做什么」(能力),技能答「该怎么做」(经验与路径)。下一篇讲这一章最不能省的一节:安全。三道闸、四个习惯、一张红线清单。
- ☐ (本篇完,下一篇 3.5 安全是头等大事)