核心篇 · Core
lv.2 核心
kp-022
标准库巡礼(batteries included)
1. 一句话定义
Python 自带约 200+ 个标准库模块,覆盖数据结构、文本、日期、网络、并发、打包等——"电池齐全"是它的核心承诺:很多问题先查标准库,再想第三方。
2. 为什么重要
标准库是零依赖、随解释器分发、文档最全的部分。熟悉地图能省掉大量"为小需求引入大依赖"的决策,也是阅读第三方源码的词汇表。
3. 前置知识
kp-014(import 机制)。
4. 核心概念(按用途的地图)
| 用途 | 模块 | 一句话 |
|---|---|---|
| 数据结构增强 | collections | deque(双端队列)、Counter、defaultdict、OrderedDict |
| 迭代工具 | itertools | 无穷序列/分组/笛卡尔积(kp-038) |
| 函数工具 | functools | lru_cache、partial、reduce、total_ordering |
| 文本与格式 | re string textwrap | 正则、模板 |
| 日期时间 | datetime zoneinfo | aware/naive 时间、时区 |
| 结构化数据 | json csv sqlite3 | 三大交换格式 |
| 系统 | os sys pathlib shutil subprocess | 路径/进程/文件批量操作 |
| 并发 | threading multiprocessing concurrent.futures asyncio | 四种并发模型(模块 03) |
| 网络 | urllib.request http.server socket | 标准库能跑通最简单的 HTTP |
| 工程化 | unittest logging argparse timeit profile | 测试/日志/CLI/性能 |
| 数据完整性 | hashlib base64 secrets uuid | 哈希、编码、随机(安全随机用 secrets!) |
| 类型 | typing dataclasses | 注解与数据建模 |
5. 原理与机制
选型三问:① 标准库有没有?② 有第三方更专业的吗?③ 依赖值不值得引入?——脚本工具类问题标准库常够用;领域问题(HTTP 客户端、Web 框架、数据表)选成熟第三方。
python
# collections 的四件套
from collections import deque, Counter, defaultdict
q = deque(maxlen=3); q.extend([1,2,3,4]) # deque([2,3,4]) 自动丢最老
Counter("aaabbc").most_common(1) # [('a', 3)]
# functools 两件高频
from functools import lru_cache, partial
@lru_cache(maxsize=None)
def fib(n): return n if n < 2 else fib(n-1) + fib(n-2) # 记忆化,指数→线性
byte_order = partial(int, base=2) # 固定参数生成新函数6. 关键事实(模型/图示)
text
标准库分层心智:
语言基础设施(typing/collections/itertools/functools/dataclasses)
── 之上的 ──
领域胶水(json/re/datetime/pathlib/subprocess/logging/…)7. 直观类比
标准库像精装房的基装:水电(sys/os)、门窗(json/csv)、收纳(collections)都给你装好了,拎包就能住;第三方库是定制家具——更漂亮更专业,但每件都增加搬运(依赖)成本。
8. 实例与案例
python
# 30 行以内做一个可用 HTTP 健康检查器(标准库版)
import urllib.request, time
def check(url, timeout=3):
t0 = time.perf_counter()
try:
with urllib.request.urlopen(url, timeout=timeout) as r:
return r.status, round(time.perf_counter() - t0, 3)
except Exception as e:
return type(e).__name__, round(time.perf_counter() - t0, 3)9. 常见误区
- 手写
random做安全用途 ——random非密码学安全;令牌/密码用secrets。 - 重复造 deque/Counter —— 列表头插 O(n)、手写字典计数,都是标准库一行的事。
- 以为标准库"慢所以总该换第三方" —— 它们是第三方的底层(很多 C 实现);瓶颈往往在算法与 IO(kp-034)。
- 不看
help()与pydoc—— 标准库自带离线文档:python -m pydoc -b起本地文档服务器。
10. 自测题
deque与list在头插元素上的复杂度差异?lru_cache对递归 fib 的作用原理?- 生成 CSRF token 应该用
random还是secrets?为什么?
参考答案
- deque 头插 O(1)(双向链表式实现),list 头插 O(n)(整块搬移)。
- 以参数为键缓存已算结果,重复子问题直接命中——把 O(2^n) 削成 O(n)。
secrets;random 用可预测的 Mersenne Twister,不具备密码学安全性。
11. 与其他知识点的关系
- kp-038 itertools 专文:标准库中"最 Python"的模块。
- kp-029~032 并发四件套:threading/multiprocessing/asyncio。
- kp-043 自动化:subprocess 与 argparse 的主场。
12. 延伸阅读
- Python Module of the Week(PyMOTW):https://pymotw.com/
- 官方标准库索引:https://docs.python.org/zh-cn/3/library/