《Python编程入门》序

《Python编程入门》的序。从 Python 今天在语言生态中的位置谈起,说明站内既有的 46 篇 Python 专题做的是「单点深挖」、这本书补的是「从零到能干活」的递进路径,并交代本书的三个刻意取舍、明确不写的内容,以及不同起点的读者该从哪一章进入这趟旅程。

写在前面

如果有人问你「现在学编程该从哪门语言入手」,Python 大概率会出现在答案里。它语法干净、生态庞大、上手极快,从数据分析、人工智能到自动化脚本、Web 后端,几乎每个方向都能找到它的身影。但「容易上手」这件事本身也带来一个副作用:很多人停在「能写出几行能跑的代码」这一步,就以为自己学会了 Python。

这本书想解决的,正是从「会写」到「能干活」之间那段距离。它不试图成为一份速查手册,也不试图穷尽标准库的每一个角落。它想做的事更朴素:带你从「这是什么东西」一路走到「我在真实项目里能放心地用它做决定」。而这篇文章,是这趟旅程开始前的一段闲聊——聊聊 Python 今天在语言生态里的位置,这本书为什么值得写,以及你该从哪里进入。

Python 今天的位置

在讨论「怎么学」之前,先看清它站在哪里。Python 的特殊之处在于:它既不是「最适合初学者」的玩具,也不是「只在某个领域称王」的专才,而是横跨了几乎整个软件行业的基础工具。大致可以这样概括:

领域代表库 / 工具本书是否铺垫
数据分析与科学计算pandas、polars、NumPy17.3 数据分析入门
Web 后端与 APIFastAPI、Django、Flask第 16 章
自动化与脚本argparse、subprocess、文件批处理11.3、17.1
网络与爬虫requests、httpx、BeautifulSoup12.3、17.2
人工智能与机器学习PyTorch、scikit-learn不在本书主线,17.3 仅作铺垫

这种「哪都能用」的广度,是 Python 最大的优势,也恰恰是初学者最大的困惑来源:正因为能做的事太多,反而不知道该先学什么。市面上的教程通常默认你已经选好了方向,直接开讲某个库;而一个还没建立语言心智模型的人,跟着这类教程走,往往学到最后只记住了一堆 API,却说不清它们为什么那样工作。

一个真实的小对照

抽象地说「基础重要」很容易变成口号,不如看一个具体到不能再具体的例子。假设你要读一批文本文件,统计每个文件的行数。很多人的第一版会写成这样:

import os

def count_lines(path):
    total = 0
    f = open(path)
    for line in f:
        total += 1
    return total

这段代码能跑,但它埋了几个坑:文件句柄 f 从没被显式关闭;open 没指定编码,在中文环境下可能读出乱码;函数对「文件不存在」没有任何交代。一个更接近工程写法的版本是这样的:

from pathlib import Path

def count_lines(path: Path) -> int:
    with path.open(encoding="utf-8") as f:
        return sum(1 for _ in f)

差别不在于「谁更短」,而在于后者把三件事显式化了:资源用 with 保证释放、编码被写清楚、类型注解让调用方知道它返回一个整数。这些正是本书要反复训练的东西——不是记住某个写法,而是知道一个写法在替你解决什么问题。

学习节奏:慢即是快

还有一个关于节奏的建议,值得在开头就讲清楚。

Python 的知识结构不是线性的,而是分层的。变量、数据类型、条件与循环这些「第一层」的东西,你可以在几天内建立起大致印象;但对象模型、描述符、可迭代协议、导入系统这些「第二层」「第三层」的内容,需要你在真实代码里反复遇到、反复踩坑,才会真正变成直觉。指望一口气读完就掌握,通常不现实,也没必要。

更务实的做法是:先把前几章读透,建立起最小可用的心智模型,然后回到你自己的脚本里写起来。遇到报错就翻回来查对应章节,遇到想不通的行为就回到示例里改一改,看解释器怎么反应。这种「读一段、用一段、再回来读」的循环,比从头到尾硬啃要有效得多。这本书的章节划分,本身也是按这种循环设计的——每一节都尽量是一个可以独立消化的单元。

为什么还需要一本「入门书」

本站已经积累了 46 篇 Python 主题的深度文章,覆盖了工具链、性能与内存、设计模式、异步、数据工程等方向。它们质量不低,但有一个共同的特点:每一篇都假设你已经会 Python,然后带你在某个单点上钻深。

这恰恰是它们对初学者不友好的地方。一个连虚拟环境和 import 机制都还没搞清的人,去读一篇讲内存管理与 GC 的文章,收获会很有限——不是因为文章写得不好,而是因为缺了前置的那一层。这些专题文章串起来,像是一排深井,每口井都很深,但井与井之间没有路。

这本书要补的就是这条路:一条从零到能干活的递进路径。它不假设你学过任何编程,从「解释器是什么」开始,经过语言基础、核心机制、标准库,一路走到测试、打包与部署,最后用一个完整项目收尾。读完它,你再去读那些专题文章,才能真正读出味道来。两者是互补关系:本书负责「按顺序打地基」,专题负责「就一个问题钻到底」。

本书的三个刻意取舍

在动笔之前,我为这本书定了三条规矩。它们决定了每一节的样貌,也决定了这本书不适合谁。

取舍具体含义为什么这样选
重原理与机制,而非 API 清单讲清楚一个特性为什么存在、什么时候该用,而不是罗列它能写什么语法可以查,判断力查不到
示例必须可运行,输出必须真实书中代码都在 Python 3.14.6 上实跑过,text 代码块里的输出是真实结果看来的「好像懂了」靠不住,跑一遍才算数
不回避进阶,但不炫技装饰器、生成器、异步、类型系统都认真讲,但反复提醒可维护性优先工程目标是可维护,不是可炫耀

第一,讲「为什么」,而不只是「怎么写」。 比如讲到「默认参数不要用可变对象」,重点不是背下这条规则,而是理解 Python 的函数默认值是在定义时求值一次的,所以 def f(x, acc=[]) 里的那个列表会被所有调用共享。理解了机制,你就不会在别的地方再踩同一个坑。

第二,示例要能真正跑起来。 书里出现的每一段代码,都尽量保持为可以复制进编辑器、稍作调整就能运行的最小完整片段,而不是脱离上下文的伪代码。涉及版本差异的地方,我会标注它需要哪个版本——比如 match 语句需要 3.10 以上,PEP 695 的 type X = ... 泛型语法需要 3.12 以上。这里还要交代一句版本口径:本书的代码与输出均以我本机安装的 Python 3.14.6 实测为准,它是写作时的本机版本,并不等于当时的最新补丁版本(上游同期已发布到 3.14.8),3.15 也仍停留在预览阶段;因此书中凡涉及版本行为差异的结论都按 3.14.6 给出,需要更高版本下限的语法会单独标注。

第三,不回避进阶,但也不炫技。 能把复杂的东西讲得浅显,比能写出别人看不懂的代码更值得尊敬。这条规矩在后面的每一章里都会反复出现:你会在讲装饰器、讲元类相关机制、讲异步的时候,一遍遍看到「先问能不能用更简单的写法」这句提醒。

关于「Python 很慢」的焦虑

很多人在正式学 Python 之前,先听过一句评价:「Python 慢」。这句话不能说错,但需要被拆开看。

常见说法更准确的说法
Python 是解释型语言,所以慢它先编译成字节码再执行,「解释型」这个标签并不准确(见 1.3 节)
Python 跑循环比 C 慢几十倍纯 Python 循环确实慢,但瓶颈常常根本不在循环上
做数据、做 AI 也得自己写循环你写的是 Python,跑的是 NumPy / PyTorch 底层的机器码
慢就没法用在生产大量 Web 后端、数据管道都在用;瓶颈通常在网络与数据库

第一,「慢」是相对的。在绝大多数场景里,真正的瓶颈不在语言,而在网络请求、数据库查询、磁盘 I/O——一个程序有九成时间在等网络返回,用 Python 还是 C 写这段等待都没有区别。第二,Python 把「快」外包给了 C:numpy、pandas 的底层是编译好的 C 或 Rust,你写的是 Python,跑的是机器码。第三,当瓶颈真的落在 Python 代码本身时,你有 cProfile(18.2 节)、多进程、以及把热点函数改写成扩展这几条路。

本书的态度是:先写对,再写快。过早纠结性能,会让你写出既难懂又没快多少的代码。等你能准确指出瓶颈在哪,优化才有意义。

有了 AI 辅助,还需要系统学吗

这是当下绕不开的问题:编辑器里的补全与 AI 助手已经相当聪明,它们能替你补出大半段实现,甚至顺手把类型注解和文档字符串一起写上。那么,还有必要花几周时间系统学一门语言吗?

这个问题值得认真回答,而不是用「工具只是工具」一句话打发过去。答案是:AI 让「写出能跑的代码」变便宜了,但没有让「判断代码对不对」变便宜。

同一段需求,可以写成这样:

def total(items):
    s = 0
    for it in items:
        s += it["price"] * it["qty"]
    return s

也可以写成这样:

from dataclasses import dataclass

@dataclass
class Item:
    price: float
    qty: int

def total(items: list[Item]) -> float:
    return sum(it.price * it.qty for it in items)

两种写法都能被补全工具生成,都能跑起来。但它们的长期成本相差一个数量级:前者把「items 里到底是什么」留给了运行时和运气,后者把它变成了可以被类型检查器和编辑器检查的约束。选择哪一种,取决于你对业务边界的理解,而这正是本书第二、四部分要训练的能力。

具体来说,有三件事是 AI 帮不了你、或者不能替你负责的。

第一,判断方案对不对。 同一个需求,AI 可能给你三种写法:列表推导式、生成器、或者引入第三方库。选哪一种取决于数据规模、内存约束、依赖策略——这些判断需要你理解每种写法的代价。

第二,读懂报错并决定怎么改。 报错往往不是「你写错了」,而是「你的模型没想清楚」。当解释器说某个对象没有某个属性,可能意味着类型不对,也可能意味着对象的生命周期出了问题。这类判断需要你理解语言的工作方式。

第三,为长期维护负责。 代码写在哪里、抽象到什么程度、哪些地方允许走捷径,这些决策会长期影响可维护性。工具可以生成代码,但不会为三个月后的维护者负责——那个人是你。

换个角度看,AI 助手恰恰提高了语言知识的回报率。它最擅长的场景,是在一个结构清晰、命名规范、类型信息充分的代码库里补全实现;而在一个到处是全局变量、边界模糊的脚本里,它给出的建议同样模糊。你越懂这门语言,工具就越有用。

所以本书不会因为有了 AI 就降低对原理的要求。恰恰相反,正因为生成代码变得廉价,「知道什么是对的」才变得更值钱。

本书不写什么

说清楚不做什么,往往比说清楚做什么更有助于建立正确的预期。这本书不会:

  • 从零教你计算机基础。 它假设你知道文件、目录、命令行是什么,能打开终端敲命令。如果你连「当前目录」的概念都还不熟,建议先补一点操作系统常识。
  • 深入某个特定框架的全貌。 第 16 章会用 FastAPI 带你走一遍 Web 开发,但那是为了让你理解 HTTP 与 ASGI 的机制,而不是把你训练成 Django 或 FastAPI 专家。框架会变,HTTP 的语义不会。
  • 讲运维与部署。 容器编排、云平台、监控告警这些属于「上线之后」的事,本书只在打包发布(15.2)与项目收尾(18.1)处点到为止。
  • 覆盖图形学、游戏引擎、桌面 GUI 等垂直方向。 这些领域有自己的专门教材,塞进一本入门书只会让主线失焦。
  • 承诺读完就精通。 18 章 54 节能让你扎实地入门,但「精通」是项目里磨出来的,不是读出来的。

给不同起点的读者

不同背景的人读这本书,路径应该是不一样的。

如果你完全没有编程经验,请按顺序读,不要跳章。这本书的章节顺序是刻意设计的:第 1、2 章先让你理解解释器与项目结构,第 3、4 章打语法基础,第 5 章之后才进入模块、类、异常这些真正构成「程序」的东西。每一节的示例都请亲手敲一遍——对零基础的人来说,「跑通」比「读懂」重要得多。

如果你已经有其他语言的基础(Java、C#、Go、Rust 等),你可以读得很快,但要特别留意 Python 与静态语言差异最大的三处:变量是名字绑定而非内存盒子(3.3 节)、一切都是对象且函数是一等公民(4.3 节)、缩进是语法而不是风格(1.1 节)。这三处想通了,你会发现自己上手极快;想不通,则会处处别扭。

如果你会写 Python 但没系统学过,最值得读的是第二部分(第 5–9 章)与第三部分(第 10–13 章)。你可能凭经验知道「要用 with 打开文件」「多线程没变快是因为 GIL」,但这些结论背后的机制——导入系统、属性查找、可迭代协议、事件循环——往往正是你写复杂代码时卡壳的地方。

一个反复出现的提醒:能跑不等于正确

在正式进入正题之前,有一个观念必须提前建立:程序能跑出结果,不等于结果是对的。

Python 的动态类型让「能跑」变得非常廉价。同一个 +,对数字是加法,对字符串是拼接,对列表是连接——它们都不会报错,但含义完全不同:

print(1 + 2)        # 3
print("1" + "2")    # 12,而不是 3
print([1] + [2])    # [1, 2]

更麻烦的是「长得像」的对象。一个函数期望收到数字,你传了一个看起来能参与运算的对象,它可能一路跑到底,直到某个角落才炸开。很多初学者在脚本能打印出结果之后就以为大功告成,结果把错误的结果交给了下游。

正确的定位应该是:「跑通」只是最低门槛,正确性需要靠测试(第 14 章)、类型检查(第 9 章)与边界校验(9.3 节)来共同保证。 带着这个定位去读后面的章节,你会更容易理解为什么本书既要讲语法,也要讲测试与工程化。

读完之后,你应当具备什么能力

读完这 18 章,我希望你收获的不是「记住了多少语法」,而是几项可以迁移到任何 Python 项目里的能力:

  • 面对一个需求,能判断该用标准库的哪个模块,而不是先想到去 PyPI 搜包;
  • 看到一个报错,能读懂它在说什么,并知道该去查哪一节、哪份文档;
  • 能写出带类型注解、有测试、能打包发布的代码,而不只是「在我机器上能跑」;
  • 能解释「为什么多线程没让 CPU 密集任务变快」「为什么改了一个列表,另一个变量也跟着变」这类问题;
  • 需要时,能读懂 CPython 的行为细节与标准库源码,并保持自己跟进新版本的能力。

语言终究是工具,不是信仰。它服务于「让想法变成可以运行的软件」这个朴素目标。如果这本书能让你在敲下每一行代码时,心里都清楚它在做什么,那它的任务就完成了。

那么,我们开始吧。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「python」更多文章

  1. 《Python高级编程》目录
  2. 《Python高级编程》11.3 PEP 流程与版本迁移策略
  3. 《Python高级编程》11.2 嵌入式与自由线程运行时