13. 学完基础之后,接下来往哪走
对应官方文档:13. What Now? 一句话导读:这一章不教新语法,只回答「教程看完了,然后呢」——把「看得懂」变成「写得出」,学会自己查文档,再挑一条适合自己的进阶路。
官方第 13 章特别短:没有编号小节、几乎没有代码,通篇是一张「接下来去哪儿」的资源清单——内置函数参考、标准库参考、语言参考、PyPI、邮件列表和 FAQ。你可以把它理解成毕业典礼上发的通讯录,门牌号给你了,路得自己走。
村长觉得光给通讯录不够解渴,于是按官方的意思补成 13.1 到 13.6:先掰正心态,再给方法,最后给路线。这些编号是村长自己拆的,官网上找不到对应标题,别去官网按图索骥。
13.1 从「能看懂」到「能写出来」
教程读到这儿,最危险的状态是「打开都认识,合上写不出」。这不是你笨,是输入和输出根本是两套肌肉:看代码走的是识别回路,写代码走的是「先把问题拆成步骤、再找语法把它拼起来」的构造回路。教程从头到尾都在喂前者,后者只能靠自己敲。
你可以这样理解:看别人游泳视频一百遍,下水还是会呛。认出动作和协调肌肉不是一回事。
所以官方那句「你应该已经迫不及待想用 Python 解决真实问题了」,重点不在「想」,在「用」。村长给个最朴素的检验法:合上教程,凭记忆写一个能跑的小函数,卡住的地方再回去查。
# 练习:不看教程,写一个统计文本里每个单词出现次数的函数
from collections import Counter
def word_count(text):
words = text.lower().replace(",", " ").replace(".", " ").split()
return dict(Counter(words))
print(word_count("Python is fun. Python is easy. Fun is fun."))
{'python': 2, 'is': 3, 'fun': 3, 'easy': 1}
写完再回头对照第 5 章的 dict、第 7 章的字符串方法、第 10 章的 collections,你会发现「哦,原来是这么用」——这种带着问题回看文档的感觉,和第一次通读完全不一样。
村长划重点:别把「再从头刷一遍教程」当成进阶。第二遍应该带着具体问题去查,而不是从头到尾再读一次。教程是地图,不是跑道;跑起来才算数。
13.2 挑一个真项目练手
「真项目」的标准只有一条:有人会用,或者你自己下周还会打开它。不是「把例题抄一遍」,也不是「写个斐波那契」,而是带点脏活:读文件、处理异常、参数不对时给句人话、结果能存下来。
村长建议从这三类中挑一个,都只要标准库:
- 整理类:批量给照片改名、把一堆 CSV 合成一张表、清理下载目录。
- 查询类:给一个本地文本建个搜索小工具、统计自己笔记里的词频。
- 记录类:命令行待办清单、记账本、刷题记录。
下面这个迷你待办清单,直接 python3 mini_todo.py 就能跑,麻雀虽小,读写文件、数据模型、状态修改全齐了:
"""mini_todo.py:一个不依赖第三方包的小项目,直接运行即可看到效果。"""
from dataclasses import dataclass
from pathlib import Path
@dataclass
class Todo:
title: str
done: bool = False
class TodoList:
def __init__(self):
self.items = []
def add(self, title):
self.items.append(Todo(title))
def finish(self, index):
self.items[index].done = True
def pending(self):
return [t.title for t in self.items if not t.done]
def save(self, path):
lines = [f"{'[x]' if t.done else '[ ]'} {t.title}" for t in self.items]
Path(path).write_text("\n".join(lines) + "\n", encoding="utf-8")
if __name__ == "__main__":
todo = TodoList()
todo.add("把第 13 章读完")
todo.add("自己写一个小工具")
todo.finish(0)
print("还没做的:", todo.pending())
todo.save("todo.txt")
print(Path("todo.txt").read_text(encoding="utf-8"), end="")
还没做的: ['自己写一个小工具']
[x] 把第 13 章读完
[ ] 自己写一个小工具
写完之后再给自己加需求:支持删除、支持从文件读回来、输入空标题要报错。每加一个需求,你就被迫回去翻一遍异常、文件、数据结构的章节——这才是教程的正确用法。
13.3 学会查官方文档与 PEP
官方这一章列了一串去处,村长按「什么时候翻哪本」重新排一下:
| 文档 | 什么时候翻 | 特点 |
|---|---|---|
| 内置类型与函数参考 | 忘了 str 有哪些方法、sorted 怎么传 key | 最常用,查得最快 |
| 标准库参考 | 「这活儿是不是已经有人写好了」 | 目录扫一遍就有惊喜 |
| 语言参考 | 想弄清语法边界、作用域、描述符 | 硬,但当字典用 |
| 安装 Python 模块 | 开始 pip install 之后 | 和前面第 12 章接得上 |
| 常见问题 FAQ | 提问之前 | 你的问题八成有人问过 |
不用全看,学会「查」就行。解释器里自带三件套:dir() 看有什么、help() 和 __doc__ 看怎么说、inspect.signature 看参数怎么传。
import inspect
import string
print("string 模块前 8 个名字:", dir(string)[:8])
print("str.removeprefix 的签名:", inspect.signature(str.removeprefix))
print("string 模块一句话说明:", (string.__doc__ or "").splitlines()[0])
print("--- help() 摘要 ---")
help(str.removeprefix)
命令行里还有 pydoc,不想开浏览器就能翻:
python3 -m pydoc str.removeprefix
python3 -m pydoc pathlib
至于 PEP,你可以把它理解成 Python 世界的「设计提案与会议纪要」:PEP 8 讲代码风格,PEP 257 讲文档字符串,新语法(比如海象运算符、模式匹配)都先有一份 PEP 把「为什么要加、为什么不那么加」写清楚。刚入门不必通读,但当你想问「Python 为什么这么设计」时,答案基本都在 PEP 里。
村长划重点:读文档的顺序是「先看模块页开头的综述和函数签名,再跳到 Examples,最后才啃细节」。很多人一上来就逐字读整页,三行之后就放弃了——官方文档是参考书,不是小说。另外,提问前先查 FAQ、把报错最小化成一个十行能复现的小例子,回复率能翻好几倍。
13.4 面向对象还是函数式:别急着站队
学到第 9 章的类、第 4 章的推导式之后,很多人会纠结「到底该用哪种写法」。官方教程其实从不逼你站队,因为 Python 本来就是多范式语言:它给你类、也给你推导式和 map,两边都是正经工具。
把 13.2 那个待办清单换成函数式味道,同样的事就是一条推导式:
todos = [("把第 13 章读完", True), ("自己写一个小工具", False)]
print("还没做的:", [t for t, done in todos if not done])
怎么取舍?村长给一条够用很久的土规则:
- 有状态、要长期活着、要被多处修改的东西,用类或
dataclass包起来,比如一个待办清单、一个数据库连接、一个游戏角色。 - 把一堆数据变成另一堆数据的流水线,用推导式、生成器、
map/filter,少用中间变量。 - 别为了「显得高级」硬套:Python 没有尾递归优化,也没有纯函数式的强制约束,硬写成一行
reduce只会让下周的自己看不懂。
你可以这样理解:类是给「东西」建档案,函数式是给「数据流」铺管道。多数好代码是两者混着来的,比如类的方法里照样用列表推导式。
13.5 常见进阶路线图
官方给的是资源清单,村长补一张按目标分的路标。挑一条走,别五条一起开工:
| 方向 | 先补什么 | 典型练手项目 |
|---|---|---|
| Web 开发 | HTTP 基础、路由、模板、数据库 | 一个带登录的留言板、一个 REST 接口 |
| 数据分析 | NumPy、pandas、Notebook | 把自己的账单或运动记录做成图表 |
| 自动化 / 运维 | pathlib、subprocess、argparse、日志 | 定时备份、批量改名、日志巡检脚本 |
| 测试 | unittest、pytest、断言与夹具 | 给自己 13.2 的小工具补一套测试 |
| 打包发布 | pyproject.toml、构建、twine | 把小工具传上 PyPI,让别人能 pip install |
| 参与社区 | 读源码、提 issue、补文档、答问题 | 修一个文档错别字也算贡献 |
测试是最容易被跳过、回报却最高的一条。给一个最简函数写个最小测试:
import unittest
def add(a, b):
return a + b
class TestAdd(unittest.TestCase):
def test_positive(self):
self.assertEqual(add(2, 3), 5)
def test_negative(self):
self.assertEqual(add(-1, 1), 0)
if __name__ == "__main__":
unittest.main(exit=False)
打包发布的骨架就是一份 pyproject.toml(写清 name、version、requires-python),再 python3 -m build 构建、python3 -m twine upload dist/* 上传,字段含义查 安装 Python 模块 即可。
村长划重点:
pyproject.toml里的name必须是 PyPI 上没人占过的名字,正式上传前建议先用测试仓库练一遍。twine upload是不可逆的公开动作,别拿练手包去占正式命名空间。
13.6 写在最后:给村长粉的几点建议
- 别再攒「学完再动手」。挑一个你自己真嫌麻烦的重复劳动,用二十行脚本干掉它,比再刷三章印象深。
- 报错先读最后一行。Traceback 倒着看:最后一行是异常类型和人话,倒数几行是出事的文件和行号,中间的调用栈先跳过。
- 每周留一点「能给别人用」的产出。哪怕只是把脚本整理成带
--help的命令行工具,也会逼你补上参数校验、异常处理和文档。 - 别急着追框架。标准库读顺了,再看第三方库,你会发现框架里大半是熟悉的语法换了个名字。
- 参与社区的门槛比想象中低:把复现步骤写清楚去提 issue、给文档补一句更易懂的说明、在小群里答一个你会的问题,都算。
官方那份清单里的邮件列表、PyPI、Cookbook、会议视频,现在都可以按需去翻了。教程到这里确实结束了,但你写的第一个「别人也愿意用」的小工具,才是真正的开场。
本章小结
- 第 13 章官方没有编号小节,本质是一张后续资源清单;村长把它拆成心态、方法、路线三部分来讲。
- 「能看懂」和「能写出来」是两套能力,靠合上教程凭记忆写小函数、再带着问题回查文档来补。
- 挑一个有人用的真项目(整理 / 查询 / 记录类皆可),用标准库就能走完读文件、异常、存结果的全流程。
- 查文档的顺序是「综述 → 签名 → 示例 → 细节」;
dir()、help()、inspect.signature、python -m pydoc是解释器自带的四件套。 - 面向对象管「有状态的东西」,函数式管「数据流」,Python 多范式不逼你站队;进阶按 Web、数据分析、自动化、测试、打包发布、社区六选一深入。