这本书为谁而写、Python 是什么¶
这一章讲三件事: 这本书写给谁、不写什么;Python 这门语言的根本特性(解释执行、动态类型)带来了什么能力、什么代价; 以及作者给新手的完整上手路径——环境、编辑器、装库、版本控制。读完你会拿到全书所有后续章节的「为什么」。
1. 先看现象:为什么 2026 年还有人写编程入门书¶
这本书的引言从一句反问开始:人工智能时代,还有理由写一本编程书吗?1
作者的回答分三层,值得原样记住,因为它决定了整本书的写法:
- AI 还替代不了软件工程的全部。 你仍然必须学编程的基础——这本书就是讲基础的。
- 最好的学习方式是做项目,不是做习题。 所以这本书里一道习题都没有;作者坦白他自己当年也从不做习题。
- 语言书不该是百科全书。 1000 页的 Python 百科没人读得完;一本你能从头到尾读完的薄书, 加上「需要细节时去查 Google 或问 AI 工具」,才是有效组合。书的作用是「kick start(启动)你的旅程」,不是终点。2
他还划掉了两大块内容:Web 开发(Django 之类)和 IT 安全,理由是「太具体、超出范围」。 目标读者很明确——「我为科学家和工程师写了这本书」,因为科学与工程需要的起步知识很少, 而且「科学家和工程师有成为好程序员的潜质」:会追根溯源、会结构化知识,这两件事正是编程 daily 要做的。3
这一章在全书链条里的位置¶
后面十八章全部是这三层回答的展开:「基础必须学」展开成命名、数据结构、控制流; 「书只是启动」展开成每一章末尾「自己去练」的叮嘱;「AI 替代不了」则在他讲测试、讲调试时反复回来。
2. 顶层全景:Python 的三个根本特性¶
作者对 Python 的定义只有一句话:通用的、解释执行的、高级语言,1991 年由 Guido van Rossum 创造, 名字来自喜剧团体 Monty Python(跟蟒蛇无关);现在广泛到「大多数操作系统都预装」。4
三个特性各带一句后果:
解释执行 ── 代码一行一行被当场执行,不写类型声明
└─ 好处:改完立刻跑,反馈快,适合快速试验
└─ 代价:错误要到程序跑到那一行才炸出来;跑起来比编译型语言慢
动态类型 ── 变量不声明类型,值的类型跟着内容走
└─ 好处:代码短
└─ 代价:读者(和人写的测试)必须替编译器干检查的活
生态巨大 ── 几乎任何编程主题都有现成的库
└─ 代价:你必须学会装库、管库(import、pip、虚拟环境),否则环境一团糟
图说:这三条不是并列的特性介绍,而是全书后半部所有规矩的来源。
下面逐条讲透,主线例子是书里那个故意「类型撒谎」的 add 函数。
3. 核心原理¶
3.1 解释执行:你按下回车,机器当场一行行跑¶
解决什么问题: 初学时你想「试一行代码看结果」,而不是写完整个程序再等编译。
怎么做: Python 不把你的代码先整份翻译成机器码,而是启动一个解释器(读懂一行、执行一行的程序)。 书里给出两条使用路径,对应两种节奏:
| 路径 | 怎么用 | 适合什么 |
|---|---|---|
| REPL | 命令行里输入 python,看到提示符 >>> 后逐行输入 |
试一两行代码的效果 |
| 文本文件 | 编辑器里写 .py 文件,命令行运行 python 文件名.py |
超过几行的一切代码 |
REPL 三个字母是 Read-Eval-Print Loop 的缩写:读入你的一行 → 执行 → 打印结果 → 循环等下一行。
书里给的一个细节很实用:REPL 和普通代码唯一的显著差别是查看对象——普通代码里要看一个变量的值必须调用 print,
在 REPL 里直接敲变量名回车,它就把值显示出来。5
作者的建议很直白:REPL 只用来「玩一两行」;代码长了就存成文件。另一个替代品是 Jupyter Notebook—— 在浏览器里分块执行、直接显示结果,适合小到中型的数据分析;再大就该用纯代码文件,因为那样才能用 Git 管理。6
为什么有效、边界在哪: 逐行执行换来的是极短的「改—跑—看」循环,这是它适合快速原型的原因。 边界在下一节:没有编译阶段,意味着没有任何东西在你运行之前检查你的代码。
3.2 动态类型与 type hints:省掉的声明,会变成运行时的雷¶
解决什么问题: 静态类型语言(如 Java、C++)要求每个变量先声明类型,作者承认这「不只是样板代码,而是重要的信息」—— 但写起来确实啰嗦。
怎么做: Python 不强制声明;一个变量先装数字再装文本,语言允许:
主线例子是书里这个函数,它配了类型提示(type hints)——参数和返回值后面的 : int、-> int:
走一遍这条线:类型提示写着「a 和 b 都该是整数」,但解释器既不强制也不检查;
传两个字符串进去,函数照样执行,字符串的 + 是拼接,于是返回 "hello world"——
一个没有报错的、完全偏离签名的行为。7
为什么有效、边界在哪: 动态类型让代码短,但把「类型对不对」这道题从编译时挪到了运行时。 作者由此推出两条全书反复用的结论:
- 工具如 pylint 能给警告,但「不能替代完整编译器的能力」;
- 所以「在 Python 里写单元测试比在编译型语言里更重要」——测试是唯一能替你检查代码的东西。8
这就是第 15 章整个存在的理由。
3.3 库与包管理:Python 真正的超能力是生态,真正的麻烦也是¶
解决什么问题: 几乎每个编程主题都有现成的库(libraries)——预先写好的代码集合,装来就用,不用从零造轮子。9
怎么做: 书里的最小路径是三步,但作者紧接着补了「正确路径」:
最小路径 pip install numpy → 命令行直接装(不推荐)
正确路径 python -m venv venv → 先建一个虚拟环境(自包含的目录,
source venv/bin/activate 装着它自己的 Python 和一套独立的库)
pip install numpy → 在环境里装,不污染全局
pip freeze > requirements.txt → 把依赖清单存下来,换台机器一键重建
图说:虚拟环境解决的麻烦是「项目 A 要 numpy 1.x、项目 B 要 numpy 2.x」——
两套库装在同一个全局环境里会互相覆盖。
激活之后命令行会出现 (venv) 前缀,提醒你正处在哪个环境里。10
为什么有效、边界在哪: 虚拟环境让每个项目有自己的依赖世界,删环境(删文件夹)就彻底卸载,不留垃圾。 边界:这是约定和流程,不是语言特性——忘了激活环境、装错地方,依然是新手最常见的翻车点之一。
一个最小但完整的用库闭环,走一遍:
import numpy 的作用就是把 numpy 这个名字连同它内部的一切摆进你的文件。
书里的原话:「在 Python 里,你几乎能想到的任何编程主题都有库——数据分析、Web 开发、机器学习,
预写好的代码集合,替你省掉从零造轮子的时间和错误。」9
这也解释了为什么 Python 社区的日常大量是「找库、装库、读库的用法」而不是「写底层代码」;
作者对此的态度是肯定加保留:生态是 Python 最大的超能力,而依赖管理(环境、版本、清单)就是这份超能力的账单。
3.4 风格指南与四条原则:作者把判断标准先亮出来¶
在讲任何语法之前,作者先给了两套「好代码」的判据,后面所有章节都引用它们。
第一套是他上一本书的四条基本原则:
- 写容易理解的代码(因为读远多于写);
- 写尽可能不出 bug 的代码(人会犯错,代码要能容错);
- 持续清理代码——书里的比喻是「熵总是增加的,家里叫收拾,软件里叫重构(refactoring)」;
- 写为客户创造价值的代码(别为无意义的细节争论几小时)。11
第二套是 Zen of Python(禅意 Python)的节选,作者挑了最有用的几条并逐条给了自己的解读:
| 禅句 | 作者的解读(压缩版) |
|---|---|
| Explicit is better than implicit(显式优于隐式) | 聪明的程序员爱写隐式代码,因为「高效」;但隐式代码难读、易错 |
| Simple is better than complex;Readability counts | 保持简单,可读性最重要 |
| Flat is better than nested(扁平优于嵌套) | 嵌套代码难读易错——「不信就写几个嵌套循环加 if/else,试试能不能看懂」 |
| Special cases aren’t special enough to break the rules | 尽量消灭特例、消灭 if;但别为过火——写一百行只为消掉一个 if 不值得 |
| In the face of ambiguity, refuse the temptation to guess | 宁可多写几行用不到的代码,也不猜代码的行为;要猜,至少配单元测试 |
| There should be one obvious way to do it | 只留一种做法,免得改的时候漏掉另一种而出 bug |
| If the implementation is hard to explain, it’s a bad idea | 讲不清实现,就是代码不够好;读不懂别人的代码,不是你的错,是作者的错 |
这几条在后面会反复回来:第 08 章的「少写 if」、第 02 章的命名规矩、第 15 章的测试,全是它们的应用。
3.5 四条原则与禅句,逐条再展开一层¶
第一套(四条基本原则)的逐条理由,书里的原文逻辑:
- 写容易理解的代码——依据只有一条,但它足够硬:你会花远多于写代码的时间去读代码(第 02 章有那张时间分配图)。 所以「容易理解」不是美德加分项,是时间账本的必然要求。
- 写尽可能不出 bug 的代码——「人会犯错,所以要让代码尽量 fail-safe(防错):你无法阻止所有 bug, 但可以让 bug 难以发生。」注意这条的视角是结构性的:不靠小心,靠让错误形状在代码里难以形成。
- 持续清理——熵的比喻背后是一个工程事实:代码只要活着就会变乱,不变乱只有一种可能——没人用它。 所以清理不是「有空再做」,是维护的一部分;它的正式名字叫重构(第 02 章)。
- 为客户创造价值——「很多软件工程师喜欢为无意义的细节争论几小时。别这样。客户付钱是要新功能, 不是要为你的品味买单。」这条是全书唯一一条把目光从代码移向生意的原则。
第二套(禅意 Python)里还有两条上文没展开的:
- 「Special cases aren’t special enough to break the rules」——特例少,代码就直; 作者的补充是「但也别过火:不值得为一行 if 写一百行代码」(practicality beats purity,实务胜过纯粹)。
- 「In the face of ambiguity, refuse the temptation to guess」——猜测在软件工程里出现得「太多了」; 宁可多写几行可能用不到的代码,也不猜一段代码的行为;非要猜,至少配上单元测试(第 15 章)。15
这两套判据的关系也值得看清:四原则是作者自己的提炼,禅句是 Python 社区二十多年的公共积累; 前者管「为什么」,后者管「具体怎么写」。原书把两者并排放,等于告诉读者:好代码的判据不只一家之言,但各家会收敛到同一个方向。
4. 作者的判断与证据¶
4.0 上手第一步,逐命令走一遍¶
书里散落的命令拼起来,就是新手上路的第一天(每行旁边是它干的事):
① python → 启动 REPL,出现 >>>
② >>> "echo" → 回显 'echo' —— REPL 直接显示表达式的值,不用 print
③ 退出,写文件 PrintAddress.py → 几行以上的代码就该进文件
④ python PrintAddress.py → 整份文件一次执行
⑤ python -m venv venv → 给项目建独立环境(要装第三方库时)
⑥ pip install numpy → 在环境里装第一个库
图说:①②是「试探」,③④是「正经写」,⑤⑥是「用别人的轮子」——三步对应三种工作模式。
作者唯一强推的工具是 VS Code(写书时他在用的 IDE):「我建议你也用它,除非有朋友带你用别的。」 这不是广告式的推荐,理由很实际:IDE(集成开发环境,写代码的编辑器)之间差别没有想象大, 新手缺的不是「最好的 IDE」而是「任何一个顺手的」。16
这一章作者罕见地松口:REPL 还是文件、哪个编辑器、Linux 还是 Windows,统统「 largely up to you(大体随你)」—— 全书唯一一处把选择权完全交还读者的地方。因为在「怎么开始写」这件事上,唯一错的选项是「迟迟不写」。
这一章作者的论证方式值得单独看,因为全书都是这个调子:先给经验断言,再给一两个可自己动手验证的小例子。
书里给了证据的:
- 解释执行的机制(Read-Eval-Print Loop 的工作方式、REPL 与文件执行的差别)是描述性的机制事实,可直接验证;5
add("hello ", "world")这个例子是可直接运行的演示,证明类型提示不强制;7- 工具链的命令(建 venv、pip install、pip freeze)是可照做的步骤。
属于作者个人判断(书里没有、也不可能有的「证明」)的:
- 「Python 适合小到中型项目,一般不建议用于大型项目」——理由列了三条(内存效率、速度、错误要到运行时才暴露), 并建议大项目用 Rust、Java、C++ 这类编译型语言。13
- 「测试比编译型语言更重要」——方向正确,但「更重要多少」无法量化。
- 对 Zen of Python 的解读(比如「读不懂是作者的错」)是他的立场,不是禅句本身的字面。
判断(我们的,不是书里的): 「大项目别用 Python」是这本书里最依赖上下文的一条建议。 作者的语境是「大型软件系统」(长生命周期、强正确性要求);而今天的「大项目」很多是数据管道和模型服务, Python 仍是事实标准——实际补救是类型标注 + mypy、快测试、把性能热点挪给扩展,而不是整体换语言。 如果错,会错在: 如果读者的项目恰好是作者说的那类大型软件,换语言的建议就是对的,我们这条补充反而是拖延。
5. 边界与局限¶
- 版本时效: 书写于 2026 年,提到「Python 3 发布于 2008 年,新特性仍在不断增加」;具体界面(如 VS Code 配置)会过时,机制不会。
- 故意略过的: 怎么系统地用类型标注建防线(mypy 等)没讲,只说了「不强制」;性能分析工具没讲。
- 入门即劝退的一面: 「大项目别用 Python」对初学者是重要免疫,但如果只记住这句而没记住前提,会误伤很多正当用法。
- Git 只有一小段: 只说了「这是版本控制工具,该学」,没有任何操作细节。
5.1 书里一笔带过、但值得停一秒的两处¶
「解释执行」的另一面:快反馈的完整闭环。 书里把「改完即跑」说成 Python 的优势, 完整的闭环其实是:改一行 → 存盘 → 命令行按上箭头回车 → 立刻看到结果。 对比编译型语言的「改一行 → 等编译(大项目可能几十秒到几分钟)→ 跑 → 看结果」, Python 的循环短了一整个编译环节——这就是「快速原型」四字的技术内容。 但同一枚硬币的另一面,书里第 91 段也写了:大项目里跑测试可能比当年省下的编译时间还贵—— 省下的时间是真实的,代价也是真实的。
「风格指南」不是审美洁癖。 书里把 Zen of Python 和四原则放在第一章,容易被读成「作者的个人口味」。 但它们每一条背后都有一个具体的失败模式:隐式代码会误导读者(误解 → bug)、嵌套会超出工作记忆(漏情况 → bug)、 全局变量会让值无处追溯(调试成本 → 时间)。把「风格」理解成「防 bug 的疫苗」,而不是「好不好看」——前者会在每一次读代码时兑现收益,后者只在你自己的审美里兑现, 才是这两套判据的正确读法——这一点书里没有明说,是我们从它的论证里提炼的(标为判断,不是书里的)。
6. 可带走的¶
本章主线例子,一行写完: def add(a: int, b: int) -> int 声明了类型 → 传两个字符串 add("hello ", "world") →
解释器不拦,返回 "hello world" → 证明类型提示只是提示,检查要靠测试。7
- AI 时代学编程的理由: 基础替代不了;学习靠做项目,不靠做习题;书负责启动,细节靠查。
- Python 三特性: 解释执行(反馈快、错误晚)、动态类型(代码短、检查缺)、生态大(超能力与麻烦同源)。
- REPL 只试一两行; 超过几行就写
.py文件;数据分析可以用 Jupyter;上 Git 要趁早。 - 类型提示(type hints)不强制——它给读者和 IDE 看,不拦运行;想要检查,靠 pylint + 单元测试。
- 装库走虚拟环境:
python -m venv venv→ 激活 →pip install→pip freeze > requirements.txt存档。 - 四条原则 + 禅意 Python 是全书规矩的总源头;其中「扁平优于嵌套」「显式优于隐式」出现频率最高。
- 风格 = 防 bug 的疫苗:每一条风格规矩背后,都有一个具体的失败模式——这是本章最该带走的一句,也是全书的第一个判断块。
- 「读不懂是作者的错」——遇到烂代码别自责,也别学它的写法。
3.9 引言里没处安放的三段话¶
引言里有三段话不属于任何一章的机制,但它们是作者写作动机的直接表达,收在这里:
关于持续学习。 书只是开始:「编程不是精确科学,解决问题的路有无限多条,你得找到最适合你的那条。」 他列的学习途径很杂:请朋友给代码提意见、实习、看视频、读别的书——比如他上一本 Software Engineering Made Easy, 「进一步解释你会在本书各章灰框里看到的许多话题」。要诀是从多个来源学、比较它们的建议,而不是只信一本。14
关于「改示例代码」学习法。 「开始解决一个新问题最简单的方式:找一段做类似事情的示例代码, 改到它正好做你要的事为止。」他说这其实是学任何新东西都高效的办法,不只编程。14
关于灰色框。 原书正文里散布着许多加框的小段(本书译作「加框」), 内容是作者从上一本软件工程书里搬来的原则(四原则、SRP、DRY、getter/setter 之贬都属于这类)。 读的时候可以注意这个分层:正文讲语言机制,框里讲工程判断——两层都是作者的,但性质不同。
7. 原文地图¶
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| AI 时代为何学编程、不做习题 | Introduction | text/04-fm-introduction.txt:3(搜「artificial intelligence」) · text/04-fm-introduction.txt:8(搜「didn’t write exercises」) |
| 写给科学家和工程师、排除 Web/安全 | Introduction | text/04-fm-introduction.txt:19(搜「scientists and engineers」) · text/04-fm-introduction.txt:20(搜「IT security」) |
| 解释执行、逐行执行 | 1 About Python | text/05-ch01-1-about-python.txt:9(搜「line by line」) |
| REPL 的工作方式与查看对象 | 1 About Python | text/05-ch01-1-about-python.txt:18(搜「Read-Eval」) · text/05-ch01-1-about-python.txt:43(搜「inspect an object」) |
| Jupyter 与 Git 的建议 | 1 About Python | text/05-ch01-1-about-python.txt:58(搜「Jupyter」) · text/05-ch01-1-about-python.txt:65(搜「snapshots」) |
| 动态类型、type hints 不强制 | 1 About Python | text/05-ch01-1-about-python.txt:76(搜「type hints」) · text/05-ch01-1-about-python.txt:81(搜「hello world」) |
| 运行时才发现错误、测试更重要 | 1 About Python | text/05-ch01-1-about-python.txt:91(搜「even more important」) · text/05-ch01-1-about-python.txt:96(搜「errors at runtime」) |
| 不建议大项目用 Python | 1 About Python | text/05-ch01-1-about-python.txt:93(搜「larger projects」) |
| 库是什么、pip 安装 | 1 About Python | text/05-ch01-1-about-python.txt:101(搜「prewritten code」) · text/05-ch01-1-about-python.txt:109(搜「pip install numpy」) |
| 虚拟环境与 requirements.txt | 1 About Python | text/05-ch01-1-about-python.txt:113(搜「virtual environment」) · text/05-ch01-1-about-python.txt:127(搜「requirements.txt」) |
| 四条基本原则 | 1 About Python | text/05-ch01-1-about-python.txt:160(搜「four fundamental principles」) · text/05-ch01-1-about-python.txt:177(搜「entropy always increases」) |
| 禅意 Python 各句及解读 | 1 About Python | text/05-ch01-1-about-python.txt:188(搜「Explicit is better」) · text/05-ch01-1-about-python.txt:197(搜「Flat is better」) · text/05-ch01-1-about-python.txt:217(搜「only one」) |
-
出处:「Introduction」第 3 段(
text/04-fm-introduction.txt:3,搜「Is there a reason to write a book about programming」)。 ↩ -
出处:「Introduction」第 11–17 段(
text/04-fm-introduction.txt:14,搜「1000 pages」;第 17 段,搜「kick start」)。原话:「I think it’s much more efficient to write a concise book that you can read back to back and later on you will anyway use Google or an AI assistant to find the information you need.」 ↩ -
出处:「Introduction」第 19–29 段(
text/04-fm-introduction.txt:19,搜「scientists and engineers」;第 26 段,搜「follow the traces」)。 ↩ -
出处:「1 About Python」第 3–8 段(
text/05-ch01-1-about-python.txt:4,搜「Guido van Rossum」;第 6 段,搜「preinstalled」)。 ↩ -
出处:「1 About Python」第 42–46 段(
text/05-ch01-1-about-python.txt:42,搜「only one somewhat significant difference」)。「REPL」即 Read-Eval-Print Loop,见第 17–20 段(text/05-ch01-1-about-python.txt:17,搜「alternative would be a compiled language」)。 ↩↩ -
出处:「1 About Python」第 58–61 段(
text/05-ch01-1-about-python.txt:58,搜「Jupyter Notebook」)。 ↩ -
出处:「1 About Python」第 76–81 段(
text/05-ch01-1-about-python.txt:76,搜「neither mandatory nor enforced」;第 81 段,搜「returns」)。注意:text/05-ch01-1-about-python.txt:81处的原文注释是# returns "hello world",可简化为add("hello ", "world")的返回结果。 ↩↩↩ -
出处:「1 About Python」第 89–92 段(
text/05-ch01-1-about-python.txt:89,搜「pylint」;第 91 段,搜「even more important to write unit tests」)。 ↩ -
出处:「1 About Python」第 100–105 段(
text/05-ch01-1-about-python.txt:101,搜「collections of prewritten code」)。 ↩↩ -
出处:「1 About Python」第 113–130 段(
text/05-ch01-1-about-python.txt:119,搜「minor difference」;第 127 段,搜「requirements.txt」)。Windows 与 Linux 的激活命令不同见第 119–121 段。 ↩ -
出处:「1 About Python」第 158–184 段(
text/05-ch01-1-about-python.txt:160,搜「four fundamental principles」;第 176 段,搜「entropy always increases」;「refactoring」见第 178 段)。 ↩ -
出处:「1 About Python」第 186–228 段(
text/05-ch01-1-about-python.txt:188,搜「Explicit is better than implicit」;第 197 段,搜「Flat is better than nested」;第 217 段,搜「only one」;「读不懂不是你的错」见第 228 段,搜「It’s the fault of the author」)。 ↩ -
出处:「1 About Python」第 93–96 段(
text/05-ch01-1-about-python.txt:93,搜「larger projects」)。原话:「Generally, I don’t recommend using Python for larger projects.」 ↩ -
出处:「Introduction」第 42–49 段(
text/04-fm-introduction.txt:44,搜「keep learning」;「改示例代码」法见第 36–39 段,搜「take some example code」)。 ↩↩ -
出处:「1 About Python」第 203–215 段(
text/05-ch01-1-about-python.txt:208,搜「hundred lines」)与第 211–215 段(搜「temptation to guess」)。 ↩ -
出处:「1 About Python」第 28–29 段(
text/05-ch01-1-about-python.txt:28,搜「VS Code」)与第 31–33 段(搜「short code snippets」)、第 22–27 行(文件执行方式,搜「PrintAddress.py」)。 ↩