一、总体观:把标准库当成"系统 API"
标准库(Standard Library)是 Python 自带、开箱即用的"系统 API",覆盖了从时间日期、数值计算、文件与进程、并发与网络、到配置解析、序列化与持久化、文本处理与类型系统等几乎所有通用编程需求。与第三方包相比,标准库的最大优势是稳定、跨平台、可长期维护;你可以优先用它把 70--80% 的通用需求解决,再在特定瓶颈处引入专业库做补强。
使用原则(五条)
-
"能用 stdlib 就先用 stdlib" :充分利用
pathlib
、shutil
、concurrent.futures
、asyncio
、logging
、argparse
等"现代接口"。 -
首选"声明式/高层 API" :如
pathlib.Path
替代os.path.*
,concurrent.futures
替代直接管理threading
/multiprocessing
。 -
关注"正确性语义" :如密码学随机数用
secrets
而非random
;金额计算用decimal
而非float
。 -
拥抱"标准化数据格式" :
json
、csv
、sqlite3
、configparser
、tomllib
等,让配置与数据处理简单且可移植。 -
顺应"现代 Python" :用
typing
、dataclasses
、functools
、itertools
、collections
等,让代码更可读、更易测、更快。
二、时间与日期:datetime
/ time
/ calendar
/ zoneinfo
1)datetime
:日期时间的"一站式"类型系统
-
基本类型:
date
、time
、datetime
、timedelta
、timezone
。 -
典型用法:时区安全的时间戳换算、区间计算与格式化/解析:
-
用
datetime.now(tz=ZoneInfo("Asia/Shanghai"))
获取有时区的当前时间; -
用
isoformat()
与fromisoformat()
做无歧义的序列化; -
利用
timedelta
进行加减(如 T+N 天/小时)。
-
-
近年来的"姿势升级"
-
zoneinfo
(见下)加入后,避免对第三方pytz
依赖; -
datetime.fromisoformat()
解析 ISO 8601 更稳健; -
避免"天真时间"(naive datetime),在跨区场景始终绑定时区。
-
2)time
:与系统时钟打交道的工具集
-
time.time()
系统时间戳,适合记录事件时间; -
perf_counter()
/process_time()
:性能度量首选(高分辨率、单调时钟); -
sleep()
:实现简单的调度或退避; -
建议不要 用
time.time()
度量性能(可能受系统时间修改影响)。
3)calendar
:日历辅助
-
生成某月日历、判断闰年、按周规则计算等;
-
在报表、批处理场景常配合
datetime
组织周期性数据。
4)zoneinfo
:标准库原生时区数据库(IANA)
-
适合一切需要正确时区规则(夏令时、历史切换)的业务。
-
搭配
datetime
使用:from zoneinfo import ZoneInfo from datetime import datetime dt = datetime.now(ZoneInfo("America/New_York")).isoformat()
-
迁移建议:pytz → zoneinfo;避免手写时区换算。
三、数学与数值:math
/ statistics
/ decimal
/ fractions
/ random
/ secrets
1)math
:C 级性能的基础数学
-
常量与函数:
pi
、e
、tau
、inf
、nan
、isfinite()
、isclose()
、fsum()
、factorial()
、comb()
、hypot()
、log*
、pow()
等。 -
近年增强:
math.nextafter(x, y)
、ulp(x)
等更贴近数值分析的工具。 -
性能实践:在标量数学上优先
math
;向量/矩阵运算再交给numpy
。
2)statistics
:轻量统计
-
mean
、median
、mode
、pstdev
/stdev
、quantiles
、fmean
等; -
适合报表/监控的"轻统计";大规模数据仍建议
numpy
/pandas
。
3)decimal
与 fractions
:精度与有理数
-
金额/会计 :优先
decimal.Decimal
(可配置精度与舍入); -
分数 :
fractions.Fraction
适合精确比率(如配方、比例)。
4)random
vs secrets
:可复现 vs 安全
-
random
适合模拟、抽样、洗牌、可复现实验(可设seed
); -
secrets
用于安全学 场景(令牌、邀请码、密码片段),例如secrets.token_urlsafe()
; -
规则:涉及安全/隐私/访问控制 → 必须 用
secrets
。
四、文件与路径:pathlib
/ os
/ shutil
/ glob
/ fnmatch
/ tempfile
1)首选 pathlib.Path
的面向对象路径
-
Path
统一PosixPath
/WindowsPath
差异,常用操作如:-
/
运算符拼路径:Path("data") / "in" / "a.csv"
-
read_text()
/write_text()
、iterdir()
、glob()
、rename()
、unlink()
;
-
-
相比
os.path
,可读性强且避免字符串拼接陷阱。
2)os
:进程、环境变量、低层文件系统
-
os.environ
(读写环境变量)、os.makedirs()
、os.listdir()
、os.stat()
、os.symlink()
; -
进程与权限相关在跨平台上要注意行为差异。
3)shutil
:高级文件操作
-
拷贝/移动/归档:
copy2()
、move()
、rmtree()
、make_archive()
等; -
经常与
tempfile.TemporaryDirectory()
组合,写出原子化文件操作流程。
4)模式匹配与临时文件
-
glob
/Path.glob()
:通配符批量匹配; -
fnmatch
:对单个字符串做 shell 风格匹配; -
tempfile
:创建临时文件/目录,自动回收资源(防泄露、防冲突)。
五、系统与运行时:sys
/ argparse
/ logging
/ configparser
/ platform
/ importlib
1)sys
:解释器"仪表盘"
-
sys.version
、sys.platform
、sys.executable
、sys.path
; -
sys.stdin
/stdout
/stderr
与编码控制; -
异常钩子
sys.excepthook
、资源上限getrecursionlimit()
等。
2)argparse
:命令行接口(CLI)标准做法
-
定义参数、子命令、帮助信息与默认值;
-
搭配
logging
+configparser
/tomllib
实现三位一体的可配置 CLI。
3)logging
:结构化与分级日志
-
推荐统一入口
logging.getLogger(__name__)
,用basicConfig()
/dictConfig()
配置; -
级别:
DEBUG
/INFO
/WARNING
/ERROR
/CRITICAL
; -
产线建议:JSON 日志 (
formatter
自定义)+ 按模块分 logger + 避免 print。
4)configparser
与 tomllib
-
INI 配置:
configparser
简单直观; -
TOML 原生支持:
tomllib
(Python 3.11+)读pyproject.toml
等现代配置; -
YAML/JSON:若配置较复杂、需注释或跨生态通用,可综合
json
或引入第三方PyYAML
。
5)platform
与 importlib
-
platform
:按系统/CPU/解释器差异做条件逻辑; -
importlib
:动态导入、资源访问(importlib.resources
统一包内数据文件读写)。
六、并发与异步:threading
/ multiprocessing
/ concurrent.futures
/ asyncio
1)高层首选 concurrent.futures
-
ThreadPoolExecutor
:I/O 密集任务(网络、磁盘); -
ProcessPoolExecutor
:CPU 密集任务(图像处理、数值计算); -
统一接口
submit()
/map()
/as_completed()
,降低心智负担。
2)threading
& multiprocessing
:在需要更细控制时
-
threading
:锁(Lock
/RLock
)、Event
、Condition
、Queue
; -
multiprocessing
:进程隔离、Manager
共享对象、Pipe
/Queue
进程间通信; -
注意 Windows 下的 spawn 行为(需
if __name__ == "__main__":
保护)。
3)asyncio
:单线程并发的"协程生态"
-
用
async
/await
写异步代码:大量并发 I/O(HTTP、数据库)效率极高; -
工具:
asyncio.run()
、TaskGroup
、gather()
、Semaphore
、Queue
、to_thread()
; -
模式建议:
-
纯 I/O 密集 →
asyncio
; -
轻量 I/O + 兼容同步库 →
ThreadPoolExecutor
; -
混合计算密集 →
ProcessPoolExecutor
或服务化/分布式。
-
七、数据格式与持久化:json
/ csv
/ sqlite3
/ pickle
/ dbm
1)json
:互操作首选
-
json.loads()
/dumps()
/load()
/dump()
; -
日期/小数等非原生类型:自定义
default=
与object_hook
; -
规则:跨语言/跨系统------优先 JSON。
2)csv
:轻量表格
-
DictReader
/DictWriter
操作友好; -
注意换行与编码 (
newline=""
,并显式声明编码)。
3)sqlite3
:内嵌关系型数据库
-
单文件、零部署;适合原型、桌面工具、轻量后台;
-
搭配
row_factory
得到类字典行对象; -
事务/索引照常用,仍需注意并发访问模型(多写冲突)。
4)pickle
与 dbm
-
pickle
:Python 专用序列化(不安全,不要反序列化不可信数据); -
dbm
:简单键值存储;如今更多替代为sqlite3
或专门 K/V(如 Redis---第三方)。
八、文本处理与解析:re
/ textwrap
/ difflib
/ unicodedata
/ html
/ xml
1)re
:正则表达式
-
原子能力强,但要注意可读性与性能(回溯、贪婪/惰性等);
-
复杂解析可考虑分步法、有限状态机或专用解析器。
2)文本"整形"与比较
-
textwrap
:自动换行、缩进; -
difflib
:文本相似度、差异高亮(做对账/审阅时很好用); -
unicodedata
:标准化、类别检测; -
html
、xml.etree.ElementTree
:内置解析简单场景够用;复杂 HTML 仍建议第三方解析器。
九、网络与服务:urllib
/ http.server
/ ssl
/ smtplib
1)urllib
:最小 HTTP 客户端栈
-
urllib.request
发起 GET/POST、处理代理、超时与错误; -
对比第三方:
requests
语义更友好,但在零依赖 场景urllib
仍是基线。
2)内置服务与安全
-
http.server
:临时文件服务/调试; -
ssl
:TLS 上下文、证书校验(生产中请严格配置证书与协议版本)。
十、函数式与容器"利器":itertools
/ functools
/ operator
/ collections
/ heapq
/ bisect
/ array
1)itertools
:懒序列高效组合
-
chain
、cycle
、islice
、permutations
、combinations
、groupby
; -
常用于流水线式数据处理与生成器写法。
2)functools
与 operator
-
lru_cache
:记忆化加速纯函数; -
partial
:柯里化; -
singledispatch
/singledispatchmethod
:运行时基于类型的函数分发; -
operator
:更快的运算符函数(如itemgetter
/attrgetter
)。
3)collections
:高阶容器
-
deque
(双端队列)、Counter
(计数器)、defaultdict
、OrderedDict
(3.7+ dict 已保持插入序,但此类仍有语义价值)、namedtuple
、ChainMap
; -
collections.abc
:容器协议(可迭代、可映射、可序列等)是理解 Python 数据模型的钥匙。
4)堆、二分与数组
-
heapq
:小顶堆(Top-N、优先队列); -
bisect
:有序序列插入与查找; -
array
:定类型的紧凑数组(需要更轻内存时替代 list)。
十一、类型与数据类:typing
/ dataclasses
1)typing
:类型提示成为"开发协议"
-
常用:
List
/Dict
/Tuple
/Set
/Iterable
/Mapping
、Optional[T]
、Union
、Literal
、TypedDict
、Protocol
、Self
、TypeAlias
等; -
现代写法:使用内置泛型 (如
list[int]
、dict[str, Any]
)替代typing.List[int]
(3.9+); -
设计建议:在模块 API、数据结构、跨团队接口 上写明类型,配合
mypy
/pyright
静态检查,提高鲁棒性与可维护性。
2)dataclasses
:更轻的"值对象"
-
一行
@dataclass
自动生成__init__
/__repr__
/比较等; -
用
field(default_factory=...)
、slots=True
(节省内存)等参数; -
配合
typing
定义结构化配置、领域实体、DTO 十分顺手。
十二、包与模块:import
机制、包结构与资源
1)模块与包
-
模块 是
.py
文件;包 是含__init__.py
的目录(命名空间包可不含); -
约定式布局:按功能拆包,避免巨型模块;公共 API 在包级
__init__.py
做整合导出。
2)导入与资源管理
-
importlib
提供编程式导入; -
importlib.resources
统一读取包内资源文件 (配置、模板、数据),避免手写相对路径与__file__
。
3)版本能力与兼容
-
需要兼容多 Python 版本时,可基于
sys.version_info
或typing.TYPE_CHECKING
做条件导入; -
对外库,尽量"本地封装一次,对全局统一暴露"。
十三、源码"窥探"与学习法:学会"看文档 + 读实现"
1)官方文档是"第一原理"
-
标准库 API 的行为、边界条件、异常语义都以官方文档为准。
-
养成"先读例子、再看参数、最后看边界"的习惯,避免"以为"。
2)读实现能解决"十万个为什么"
-
很多模块源码清晰易读(
itertools
的 Python 包装、functools
装饰器实现、collections
抽象基类等); -
读实现能理解复杂度/副作用/线程安全,指导我们的抽象设计和性能决策。
3)最小实验驱动
-
对"不确定的行为",写 10--30 行小脚本做可重复的小实验 (搭配
time.perf_counter()
、logging
、tempfile
、unittest
/pytest
); -
记录实验脚本与结论,沉淀为团队"最佳实践"。
十四、场景清单:从需求到选库(速查)
-
批量文件处理(跨平台) :
pathlib
+shutil
+glob
+tempfile
-
配置化 CLI 工具 :
argparse
+logging
+configparser
/tomllib
-
定时/计划任务 :
datetime
+time.sleep()
(轻量)或交给系统调度(cron/Task Scheduler) -
高并发 I/O :
asyncio
(HTTP、DB、消息队列)或ThreadPoolExecutor
-
CPU 密集 :
ProcessPoolExecutor
/multiprocessing
,或外部化(C 扩展、分布式) -
报表/统计 :
statistics
+json/csv
+sqlite3
-
金额/小数 :
decimal
-
安全令牌/随机口令 :
secrets
-
文本差异与审阅 :
difflib
-
拓扑排序/依赖求解 :
graphlib.TopologicalSorter
(例如管线任务的有向无环图) -
包内静态资源 :
importlib.resources
-
类型严谨的大型工程 :
typing
+dataclasses
+ 静态检查器
十五、最佳实践与避坑指南(精炼版)
-
路径统一用
pathlib
;仅当调用旧接口或极低层 API 时再落回os.path
。 -
日志代替
print
;分级别、分模块、可配置,产线输出尽量结构化(JSON)。 -
严格区分
random
与secrets
;任何安全相关都不能用random
。 -
性能度量用单调时钟 (
perf_counter()
),不要用time.time()
。 -
时区全链路绑定 :
zoneinfo
+ 有 tz 的datetime
,序列化用 ISO 8601。 -
数据持久化优先通用格式 :
json/csv/sqlite3
,pickle
仅限可信边界内。 -
并发模型选型先行 :I/O 密集 →
asyncio
/ 线程池;CPU 密集 → 进程池/分布式。 -
让类型成为文档 :为公共 API 写
typing
注解,数据结构用dataclasses
。 -
配置与代码解耦 :
configparser
/tomllib
+ 环境变量,把密钥等放到外部注入。 -
读源码学语义:遇到边界行为,优先翻实现与测试用例,胜过"猜"。
标准库不是"功能清单",而是构建 Python 应用的地基与钢筋 。当你以"系统 API"的视角来理解与选择模块,就会自然地写出更简洁、可维护、可迁移 的代码。结合你课件第八章中对关键模块的入门引导,这份梳理进一步补足了近年来的现代化接口(如 pathlib
、concurrent.futures
、asyncio
、zoneinfo
、tomllib
、graphlib
、dataclasses
、typing
等),并通过场景化清单与最佳实践把"知道"转化为"能用、好用、用对"。后续如果你需要,我可以把以上内容进一步改造成讲义大纲 (含练习与代码模板),或拆分为团队内部的标准库使用指南 与代码片段库,方便直接复用到项目中。