一、总体观:把标准库当成"系统 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 等),并通过场景化清单与最佳实践把"知道"转化为"能用、好用、用对"。后续如果你需要,我可以把以上内容进一步改造成讲义大纲 (含练习与代码模板),或拆分为团队内部的标准库使用指南 与代码片段库,方便直接复用到项目中。