Free Programming Books
学习资源 · 免费书籍 · 编程入门
社区维护的免费编程学习资源清单,45 种语言分册含中文专版,另有速查表、在线课程、题集与编程环境。
正在打开工具详情…
1360 多个 Python 算法与数据结构实现,分45 个类别,附 DIRECTORY 导航与 doctest 校验,仅供学习。
学算法时想要可运行、可验证(doctest)的标准实现当参照,或者要找某个冷门算法现成实现的人。
要在生产代码里直接用的——官方明说这些实现可能不如标准库;也不适合需要高性能或经过生产验证的库的场景。
The Algorithms - Python 是社区维护的 Python 算法实现集,按 DIRECTORY.md 统计有 45 个类别、1300 多个实现文件,从排序、图论、动态规划一路到密码学、图形学、量子计算。
但它的定位必须先说清楚,这是官方在 README 顶部就写明的:这些实现只用于学习目的,效率可能不如 Python 标准库里的实现,自行斟酌使用。
这句话不是客套,是选型时最关键的信息。标准库有 sorted、heapq、bisect,性能是 C 实现的;这里的实现是为了让你看懂算法怎么写,不是为了直接拿去做生产里的热路径。当成教科书和练习集用,不要当成库用。
它的真正价值在两点。 一是每份实现都带 doctest:贡献规范明确要求 docstring 里要有清晰说明和/或来源 URL,并且 doctest 要同时覆盖有效输入和错误输入,这意味着你读代码时看到的示例是能直接跑的,而且不会只演示顺利路径。二是分类完整:45 个类别里有些是标准算法教材不会覆盖的——ciphers(密码学)、fractals(分形)、cellular_automata(元胞自动机)、boolean_algebra(布尔代数)、quantum(量子计算)、financial(金融)、geodesy(测地学),想找某个冷门算法的实现,这里往往比搜索引擎更快。
工程规范相当严,这一点从 CONTRIBUTING 能看出来: 遵循 Python 命名约定(变量函数小写、常量全大写、类名驼峰),PEP 8,代码风格用 ruff,格式用 pre-commit 自动处理。命名上有一条原则我觉得很值得单独说:—— 不好懂, 就懂。规范里明确写「用描述性命名帮你省掉冗余注释」。
gcd()greatest_common_divisor()提交流程有两条容易踩的:不接受重复实现——已有同一算法的实现就别再提一个功能相同的,允许的是新解法、不同表示、不同复杂度,提交前先搜一遍;不要为贡献算法去开 issue,直接提 PR——仓库不分配 issue,官方明说了不用先问。
所有提交会过 GitHub Actions 的 ruff check 和测试,测试跑的是 doctest。
想找导航从仓库里的 DIRECTORY.md 进(https://github.com/TheAlgorithms/Python/blob/master/DIRECTORY.md),那份文件有 85KB,分类目录比在仓库里翻更清楚。仓库支持 Gitpod 一键在线改代码。
上手步骤之外的具体做法:常见场景怎么配、命令怎么写、报错怎么处理。
从 DIRECTORY 导航到读懂一份实现的 doctest,讲清它的定位边界和贡献规范里值得学的命名原则。
README 顶部原话:这些实现只用于学习目的,效率可能不如 Python 标准库里的实现,自行斟酌使用。
这不是客套。标准库的 sorted、heapq、bisect 是 C 实现的,性能不在一个量级。
当成教科书和练习集用,不要当成生产库用。 装进热路径之前,先找个正经的库。
DIRECTORY.md(在新标签页打开) 是导航入口,85KB,按 45 个类别列全所有实现。比在仓库文件树里翻清楚得多。
分类里有些是标准算法教材不会覆盖的:
| 类别 | 内容 |
|---|---|
| ciphers | 密码学算法 |
| fractals | 分形 |
| cellular_automata | 元胞自动机 |
| boolean_algebra | 布尔代数 |
| quantum | 量子计算 |
| financial | 金融计算 |
| geodesy | 测地学 |
| neural_network | 神经网络 |
| computer_vision | 计算机视觉 |
想找冷门算法的现成实现,这里往往比搜索引擎快。
这是这个项目比一般算法集认真的地方。贡献规范要求每份实现:
「同时测错误输入」这一条意味着你看到的示例不是只演示顺利路径——异常分支也有覆盖。读代码时可以直接信它给的例子。
自己跑一下某个文件的 doctest:
bashpython -m doctest <文件路径> -v规范严到有点不必要,但其中一条原则我认为是精华:
展开缩写。
gcd()不好懂,greatest_common_divisor()就懂。规范里明确写「用描述性命名帮你省掉冗余注释」。
意思是:与其写注释解释 gcd 是什么意思,不如把它叫 greatest_common_divisor。命名做好了,注释就省了。
其他可借鉴的:
ruffpre-commit 自动处理,不用手改一、不接受重复实现。 已有同一算法的实现就别再提一个功能相同的。但官方明确欢迎这几种:
提交前先搜一遍。
二、不要为贡献算法去开 issue,直接提 PR。 仓库官方明说「我们不在这个仓库分配 issue,所以不要请求许可」。开 issue 问「我可以贡献吗」是白费功夫。
所有提交会过 GitHub Actions:ruff check 加测试(跑的是 doctest)。提 PR 后页面底部会显示运行状态,失败点 details 能看输出。
仓库有 Gitpod 支持,徽章就在 README 顶部。不用配环境就能在浏览器里改一个算法练手,对想快速试一段代码很方便。
推荐顺序:
第3 步是关键:这个项目的价值在于让你看懂并自己写出实现,复制粘贴等于没学。
社区在 Discord(the-algorithms.com/discord),有问题可以在那里问。
85KB 的分类目录,是找特定算法的第一入口。含 ciphers、fractals、quantum 这些教材不覆盖的冷门类别。
github.com(在新标签页打开)不只是提交规则。「展开缩写、用描述性命名省掉冗余注释」这条原则本身就值得读。含「不接受重复实现」「不要开 issue 直接提 PR」两条硬规则。
github.com(在新标签页打开)TheAlgorithms 组织的站点入口,Discord 是提问和交流的主要场所。
the-algorithms.com(在新标签页打开)同一需求下可以先试这些,尤其是不想买商业许可的时候。
学习资源 · 免费书籍 · 编程入门
社区维护的免费编程学习资源清单,45 种语言分册含中文专版,另有速查表、在线课程、题集与编程环境。
Python · 脚本 · 数据分析
脚本、数据分析、爬虫和不少课程作业的默认语言。
notebook · 数据探索 · 教学演示
在浏览器里交错写代码和说明,数据和教学演示常用。