跳到主要内容

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 写在最后:给村长粉的几点建议​

  1. 别再攒「学完再动手」。挑一个你自己真嫌麻烦的重复劳动,用二十行脚本干掉它,比再刷三章印象深。
  2. 报错先读最后一行。Traceback 倒着看:最后一行是异常类型和人话,倒数几行是出事的文件和行号,中间的调用栈先跳过。
  3. 每周留一点「能给别人用」的产出。哪怕只是把脚本整理成带 --help 的命令行工具,也会逼你补上参数校验、异常处理和文档。
  4. 别急着追框架。标准库读顺了,再看第三方库,你会发现框架里大半是熟悉的语法换了个名字。
  5. 参与社区的门槛比想象中低:把复现步骤写清楚去提 issue、给文档补一句更易懂的说明、在小群里答一个你会的问题,都算。

官方那份清单里的邮件列表、PyPI、Cookbook、会议视频,现在都可以按需去翻了。教程到这里确实结束了,但你写的第一个「别人也愿意用」的小工具,才是真正的开场。

本章小结​

  • 第 13 章官方没有编号小节,本质是一张后续资源清单;村长把它拆成心态、方法、路线三部分来讲。
  • 「能看懂」和「能写出来」是两套能力,靠合上教程凭记忆写小函数、再带着问题回查文档来补。
  • 挑一个有人用的真项目(整理 / 查询 / 记录类皆可),用标准库就能走完读文件、异常、存结果的全流程。
  • 查文档的顺序是「综述 → 签名 → 示例 → 细节」;dir()、help()、inspect.signature、python -m pydoc 是解释器自带的四件套。
  • 面向对象管「有状态的东西」,函数式管「数据流」,Python 多范式不逼你站队;进阶按 Web、数据分析、自动化、测试、打包发布、社区六选一深入。