▤书架
▶目录

代码速查表

出处里的文件都在 编程/教材/。


输入关键词开始查 —— 多个词用空格隔开(都要命中)。

1 数据进

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
读一个文本文件 读文件 打开文件 with open("a.txt", encoding="utf-8") as f:
text = f.read()
一次读成字符串 Python核心 §6 必须用 with,否则文件不关闭
一行一行读(大文件) 逐行读 大文件 with open("a.txt", encoding="utf-8") as f:
for line in f:
print(line.rstrip())
一次只读一行,不吃内存 阶段10 行尾自带 \n,用 rstrip() 去掉
读成行的列表 readlines lines = f.readlines() 全部读进列表 阶段10 大文件会爆内存
读 CSV 成表格 读csv 读表格 df = pd.read_csv("trials.csv") 一行搞定,自动识别表头 科研计算 §3 中文路径/编码问题用 encoding="utf-8"
读 Parquet(快) parquet 大数据 df = pd.read_parquet("a.parquet") 大数据专用格式 科研计算 §5 需要先装 pyarrow
把一行 CSV 切成字段 split 切分 逗号 parts = [p.strip() for p in line.split(",")] 按逗号切成列表 阶段9 先 strip() 去空格," 18 " 不是 "18"
把字符串转成数字 转数字 类型转换 float(s.strip()) / int(s) 字符串→数 阶段9 有空格会报 ValueError,先 strip
跳过空行和注释行 跳过空行 if not line or line.startswith("#"):
continue
脏数据常见处理 阶段10 —
读文件时定位路径 路径 文件在哪 from pathlib import Path
HERE = Path(__file__).resolve().parent
p = HERE / "data" / "raw.csv"
基于脚本自身位置找文件 阶段10 ⚠️ 别写死 /Users/...

2 看数据

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
看前几行 预览 head df.head() 看数据长什么样 科学计算栈 §3 拿到数据第一件事就是它
看形状(几行几列) 形状 shape df.shape / arr.shape 返回 (行, 列) 科学计算栈 §2 numpy 调试第一件事
看每列的类型 类型 dtype df.dtypes / arr.dtype 检查有没有被读成字符串 科学计算栈 §3 数字列被读成 object 是常见坑
看列的统计摘要 描述 describe df.describe() 一次给出 count/mean/std/min/max 科学计算栈 §3 —
数有多少行 行数 多少条 len(df) / len(records) 数据量 阶段9 —
看字符串的"真面目" repr 空格 换行 print(repr(s)) 显示出空格、换行符 阶段9 直接 print 看不出空格
看数组的维度数 维度 ndim arr.ndim 1=向量 2=矩阵 科学计算栈 §2 —
看总元素个数 size arr.size 所有元素总数 科学计算栈 §2 和 shape 不是一回事

3 选数据

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
按列名取一列 取列 选列 df["反应时"] 用名字取,不用记位置 科学计算栈 §3 列名不存在会 KeyError
按条件筛选行 筛选 过滤 条件 df[df["正确"] == 1] 只留满足条件的行 科研计算 §3 —
多条件筛选 多条件 and df[(df["rt"] > 200) & (df["rt"] < 2000)] 两个条件都要满足 科研计算 §3 ⚠️ 用 & 不用 and,每个条件必须加括号
数组条件筛选 布尔索引 a[a > 3] 只留大于 3 的元素 科学计算栈 §2 条件要用括号包住
条件替换值 where 满足则 np.where(a > 3, a, 0) 满足保留,否则置 0 科学计算栈 §2 三个参数:条件、真值、假值
剔除异常反应时 剔除 异常值 清洗 clean = rts[(rts >= 0.2) & (rts <= 3.0)] 只保留合理范围 阶段10 阈值要在分析前定好并写进论文
剔除答错的试次 剔除错误 只留对的 df = df[df["正确"] == 1] 只分析正确试次 科研计算 §3 有些分析反而要看错误试次,想清楚
取列表/字符串的一段 切片 片段 s[0:4] / lst[1:] 含头不含尾 Python核心 §4 s[0:4] 取 4 个字符(0,1,2,3)
倒过来 倒序 反转 s[::-1] 步长 -1 Python核心 §4 —
按位置取元素 索引 第几个 lst[0] / lst[-1] 第一个 / 最后一个 Python核心 §4 越界会 IndexError(切片不会)
按名字从字典取值 字典取值 get d.get("键", 默认值) 键不存在也不报错 Python核心 §1 d["键"] 会报 KeyError,.get() 不会
去重 去重 唯一 set(nums) / list(set(nums)) 一行去重 阶段8 顺序会丢
分组 分组 groupby df.groupby("条件")["反应时"].mean() 按条件分组算平均 科学计算栈 §3 结果要 .reset_index() 才能存成正常 CSV

4 算

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
对一个数组整体运算 向量化 不用for arr + 10 / arr * 2 / arr ** 2 一次算完,快几百倍 科学计算栈 §1 有 for 循环通常就有优化空间
求和 求和 sum arr.sum() / sum(lst) 全部加起来 科学计算栈 §2 —
按列/按行求和 axis 轴 行列 arr.sum(axis=0) 每列
arr.sum(axis=1) 每行
沿某个方向压缩 科学计算栈 §2 ⚠️ axis=0 消掉行,搞反结果全错
平均 平均 mean 均值 arr.mean() / df["rt"].mean() 算术平均 科学计算栈 §2 空列表要先判断,否则除以 0
中位数 中位数 median df["rt"].median() 排中间那个数 阶段12 偶数个取中间两个的平均
标准差 标准差 std df["rt"].std() / np.std(a) 离散程度 阶段12 np.std 默认除以 n,pd.Series.std 默认除以 n-1(样本标准差)
最大/最小 最大 最小 max arr.max() / min(lst) 极值 科学计算栈 §2 —
一次算多个统计量 agg 汇总 df.groupby("条件")["rt"].agg(["mean","median","std","count"]) 一张表给出多个量 科学计算栈 §3 —
两列算相关 相关 pearson stats.pearsonr(x, y) 返回 r 和 p 科学计算栈 §5 别拿完全相同的数据试,会有精度警告
两组比均值 t检验 ttest stats.ttest_ind(g1, g2) 独立样本 t 检验 科学计算栈 §5 同一批人前后测要用 ttest_rel
同一批人前后比 配对 ttest stats.ttest_rel(before, after) 配对样本 t 检验 科学计算栈 §5 —
正态分布概率 正态 cdf pdf stats.norm.pdf(0) 密度
stats.norm.cdf(0) 累积
概率密度 / 累计概率 科学计算栈 §5 —
解线性方程组 解方程 solve np.linalg.solve(A, b) 解 Ax = b 阶段9 比先求逆再乘更快更稳
求逆矩阵 逆矩阵 inv np.linalg.inv(A) 矩阵的"除法" 阶段9 det=0 时报 LinAlgError
求行列式 行列式 det np.linalg.det(A) 一个数 阶段8 接近 0 说明接近奇异
求伪逆(共线时兜底) 伪逆 pinv np.linalg.pinv(A) 不可逆时也能给个解 阶段16 底层就是 SVD
求特征值(一般矩阵) 特征值 eig vals, vecs = np.linalg.eig(A) 特征值 + 特征向量 阶段13 可能返回复数
求特征值(对称矩阵) 特征值 eigh vals, Q = np.linalg.eigh(A) 更快更稳,自动升序 阶段15 ⚠️ 喂非对称矩阵会静默给错结果
奇异值分解 SVD svd U, S, Vt = np.linalg.svd(A) 任何矩阵都能分 阶段16 U 和 Vt 大小不同,重构要截断
求矩阵的幂 矩阵幂 幂运算 np.linalg.matrix_power(A, k) A 的 k 次方 阶段15 别用 A ** k(那是逐元素)
求秩 秩 rank np.linalg.matrix_rank(A) 独立方向个数 阶段10 判共线性要看条件数,不是秩
求条件数 条件数 cond np.linalg.cond(A) 病态程度 阶段10 > 30 警惕,> 1000 基本不可信
数值积分 积分 quad scipy.integrate.quad(f, a, b) 求定积分 阶段12 返回 (值, 误差)
符号求导/积分 sympy diff integrate sp.diff(x**2, x)
sp.integrate(x**2, x)
解析解(带公式) 阶段11 sympify 字符串时符号要对上
把循环压成一行 推导式 [i**2 for i in range(5)] 列表推导 Python核心 §4 超过两层就该写回 for
带条件的推导式 推导式 条件 [i for i in range(5) if i > 2](筛)
[i if i > 2 else 0 for i in range(5)](换)
筛子和加工 Python核心 §4 ⚠️ 两种 if 位置完全不同
省内存的"推导式" 生成器 省内存 (i**2 for i in range(10**7)) 边用边算 Python核心 §4 用完就空,不能遍历两次
交换两个变量 交换 互换 a, b = b, a 不用临时变量 阶段9 —
安全地比较小数 浮点数 isclose math.isclose(a, b) 避免精度问题 Python核心 §7 ⚠️ 永远别用 == 比浮点数
固定的随机数 随机种子 seed rng = np.random.default_rng(42) 让结果可复现 科研计算 §4 用 random 也要单独 random.seed(42)

5 画

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
画折线图 折线 曲线 plot plt.plot(x, y, label="曲线") 趋势图 科学计算栈 §4 —
画柱状图 柱状 条形 bar plt.bar(x, y, yerr=err) 条件对比(论文标配) 科学计算栈 §4 yerr 加误差棒
画散点图 散点 scatter plt.scatter(x, y) 看相关、个体差异 科学计算栈 §4 —
画直方图 直方图 hist plt.hist(data, bins=30) 看分布(如反应时分布) 科学计算栈 §4 bins 决定柱子数量
加标题和轴标签 标题 标签 plt.xlabel("x")
plt.ylabel("y")
plt.title("标题")
标清楚画的是什么 科学计算栈 §4 图必须有轴标签,不然没人看得懂
显示图例 图例 legend plt.legend() 显示 label 的内容 科学计算栈 §4 要在 plot 的 label 之后调用
存成图片 保存 导出 savefig plt.savefig("plot.png", dpi=150, bbox_inches="tight") 存文件 科学计算栈 §4 ⚠️ 必须在 plt.show() 之前
让图上能显示中文 中文 字体 方框 plt.rcParams["font.sans-serif"] = ["Arial Unicode MS", "PingFang SC"]
plt.rcParams["axes.unicode_minus"] = False
中文和负号正常显示 科学计算栈 §4 第二行最容易忘,负号会变方框
生成画图用的坐标 linspace 等间距 x = np.linspace(-5, 5, 200) 含终点,画图用这个 科学计算栈 §2 arange 不含终点,容易少画一段

6 存

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
写文本文件 写文件 保存 with open("out.txt", "w", encoding="utf-8") as f:
f.write("内容\n")
写到文件 阶段10 ⚠️ write() 不会自动换行,要自己写 \n
追加而不是覆盖 追加 append with open("log.txt", "a", encoding="utf-8") as f: 在末尾加 阶段10 ⚠️ "w" 会立刻清空原文件,不可撤销
存表格成 CSV 存csv 导出 df.to_csv("out.csv", index=False) 存成表格 科学计算栈 §3 index=False,否则多存一列行号
存成 Parquet 存parquet df.to_parquet("out.parquet") 大数据格式 科研计算 §5 需要 pyarrow
建目录(不存在才建) 建目录 mkdir p.parent.mkdir(parents=True, exist_ok=True) 避免"目录已存在"报错 阶段10 两个参数几乎总要带上
判断文件在不在 文件存在 exists Path("a.txt").exists() 检查存在性 阶段10 —

7 代码组织

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
定义函数 函数 def def mean_of(nums):
return sum(nums) / len(nums)
包装一段逻辑 阶段4 想清楚"返回什么"
定义带默认值的函数 默认参数 def f(x, threshold=0.8): 调用时可省略 阶段5 ⚠️ 默认值别用可变对象(见下)
要一个"默认为空列表"的参数 可变默认参数 def add(x, lst=None):
if lst is None:
lst = []
用 None 占位 Python核心 §1 ⚠️⚠️ def add(x, lst=[]) 是经典大坑
一次返回多个值 返回多个 元组 def f(): return min(nums), max(nums)
lo, hi = f()
返回的是元组 阶段9 —
定义类 类 class class Subject:
def __init__(self, sid):
self.sid = sid
把数据和行为打包 阶段12 self 是"这个实例自己"
子类复用父类 继承 super class Child(Parent):
def __init__(self, x, y):
super().__init__(x)
先干父类的活 阶段13 ⚠️ 不调 super().__init__ 会缺属性
让对象能 print 得好看 repr def __repr__(self):
return f"Subject({self.sid!r})"
调试显示用 阶段12 不写会显示 <object at 0x...>
让对象能 len() len 魔术方法 def __len__(self):
return len(self.rts)
支持内置语法 阶段12 —
让方法像属性一样读 property 只读 @property
def mean_rt(self):
return sum(self._rts)/len(self._rts)
s.mean_rt 不带括号 阶段13 默认不能赋值
复制一个列表 拷贝 copy b = a.copy() / b = a[:] 真的复制一份 Python核心 §1 b = a 不是复制,是贴了个新标签
深拷贝(嵌套结构) 深拷贝 deepcopy import copy
b = copy.deepcopy(a)
连里面也复制 Python核心 §1 浅拷贝在嵌套时会"串味"
判断是不是同一个对象 is 身份 a is b 同一个对象? Python核心 §2 只有判断 None 时才该用 is
判断是不是 None None 判断 if x is None: 标准写法 Python核心 §2 别写 == None
把代码拆成多个文件 模块 import # utils.py 里定义函数
# main.py 里 import utils
utils.my_func()
一个文件干一件事 阶段11 模块名 = 文件名去 .py
让文件既能跑又能被导入 main if __name__ == "__main__":
main()
直接运行才执行 阶段11 每个可运行文件都该有这个块
装一个环境 虚拟环境 venv python -m venv .venv
source .venv/bin/activate
独立包目录 阶段16 ⚠️ .venv/ 别提交到 Git
记录依赖清单 requirements pip freeze > requirements.txt
pip install -r requirements.txt
让别人能复现 阶段16 —
用 with 管资源 with 上下文 with open("a.txt") as f: 出块自动清理 Python核心 §6 打开文件一律用
给函数加功能但别改它 装饰器 decorator @functools.wraps(func)
def wrapper(*args, **kwargs):
包一层 Python核心 §6 functools.wraps 别省

8 排错

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
看报错该怎么读 报错 traceback 先看最后一行(类型+原因)
再看倒数第二三行(文件+行号)
读报错的顺序 工程能力 §3 最后一行才是错误本身
在代码里下断点 断点 调试 breakpoint breakpoint() 程序在这里暂停 工程能力 §3 ⚠️ 提交前记得删掉
调试器怎么操作 pdb 命令 p 看变量 / n 下一步 / c 继续 / q 退出 交互式调试 工程能力 §3 最常用的是 p、n、c
打印变量名和值 f-string 调试 print(f"{total=}") 自动带上变量名 阶段14 比 print(total) 清楚得多
主动报错(数据不对就停) 抛异常 raise raise ValueError(f"反应时必须为正,收到 {rt}") 快速失败 阶段12 比让它带着错数据往下跑好
保留错误原因 raise from raise ValueError("...") from e 报错链不断 阶段14 —
处理可能的错误 try except try:
rt = float(s)
except ValueError:
rt = 0.0
出错时兜底 阶段10 ⚠️ 别写 except Exception: pass(静默吞错)
文件可能不存在 FileNotFound 处理 try:
with open(p) as f: ...
except FileNotFoundError:
...
缺文件时给默认 阶段10 文件必须存在时别抓,让它崩
写测试 测试 assert pytest assert mean_of([1,2,3]) == 2 检查用例 阶段14 小项目用 assert 就够
用 pytest 跑测试 pytest pytest -v 跑所有 test_*.py 工程能力 §4 文件名要 test_ 开头才会被发现
检查两个形状能不能运算 广播 广播失败 右对齐逐位比:相等或其中一个是 1 numpy 广播规则 科学计算栈 §2 ⚠️ 先 print(a.shape)
把一个一维数组竖起来 reshape 升维 c = np.array([100,200]).reshape(2, 1) 让它能按行广播 科学计算栈 §2 —
看环境里装了什么 版本 装了哪些包 import importlib.metadata as md; md.version("numpy") 查包版本 阶段16 排查"在我电脑上能跑"
看 Python 是哪个 解释器 路径 import sys; print(sys.executable) 当前用的解释器 阶段16 虚拟环境激活后会变

9 Git

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
把目录变成仓库 初始化 init git init 一个项目只做一次 工程能力 §1 —
看现在什么情况 状态 status git status 最常敲,只读不改 工程能力 §1 任何 Git 问题先跑它
看改了什么 差异 diff git diff 逐行显示改动 阶段13 git diff --staged 看暂存区的
把改动放进暂存区 暂存 add git add 文件名 挑要提交的 工程能力 §1 先 git status 再 add
提交一版 提交 commit git commit -m "修复空行崩溃" 存一版历史 工程能力 §1 信息要动词开头 + 说清做了什么
看历史 日志 log git log --oneline 一行一条 阶段13 --graph 看分支图
建分支并切过去 分支 branch git switch -c 新功能 / git checkout -b 新功能 在平行世界改代码 阶段15 分支只是个指针,几乎零成本
切回主干 切换 switch git switch main 文件变成主干的样子 阶段15 —
合并分支 合并 merge git merge 新功能 把分支的改动并进来 阶段15 可能冲突(见下)
解决冲突 冲突 conflict 手工编辑文件,删掉 <<<<<<<、=======、>>>>>>> 三行,然后 git add + git commit 三行标记必须全删 阶段15 ⚠️ 不删标记 = 语法错误
连上 GitHub 远程 remote push git remote add origin <地址>
git push -u origin main
推到远程 阶段15 -u 只在首次需要
拉取别人的更新 拉取 pull fetch git pull(= fetch + 合并)
git fetch(只下载,不动工作区)
同步远程 阶段15 不确定时先 fetch 看看
撤销工作区改动 撤销 restore git restore 文件 ⚠️ 改动会永久丢失 阶段15 用之前先 git diff 看清楚
从暂存区拿出来 取消暂存 git restore --staged 文件 文件内容不变 阶段15 安全操作
把改动先收起来 暂存 stash git stash / git stash pop 最安全的"先放一放" 阶段15 拿不准时用这个
忽略某些文件 gitignore 忽略 见 .gitignore 一节 别提交缓存/密码/大数据 工程能力 §1 ⚠️ 注释必须单独一行,行尾注释会让规则失效
停止跟踪某个文件 rm cached git rm --cached 文件 从 Git 移除但保留本地 阶段13 .gitignore 对已跟踪文件无效,要用这个

.gitignore 的标准写法:

# 注释必须单独占一行(写行尾会让规则失效!)

# Python 缓存
__pycache__/
*.pyc

# 密钥(⚠️ 绝不能提交)
.env

# 分析产物(可从原始数据重新生成)
data/processed/
results/

# 系统文件
.DS_Store

⚠️ 提交过密钥就必须换掉。即使后来删了文件,它仍在 Git 历史里,别人 clone 下来还能翻出来。


10 环境

我想做什么 搜索关键词 代码写法 一句话解释 出处 坑
建虚拟环境 venv 虚拟环境 python -m venv .venv 独立的包目录 阶段16 每个项目一个
激活/退出 激活 activate source .venv/bin/activate
deactivate
让 python 指向它 阶段16 激活后 which python 会变
装包 安装 pip install pip install numpy pandas 装包(只影响当前环境) 阶段16 —
按清单装包 requirements pip install -r requirements.txt 一键复现环境 阶段16 —
看装了哪些包 列出 pip list pip list / pip freeze 列出已装包和版本 阶段16 freeze 输出可以直接当清单
conda 建环境 conda create conda create -n myenv python=3.12
conda activate myenv
比 venv 多管非 Python 依赖 阶段16 装 PyTorch 时更省事
导出/重建 conda 环境 environment.yml conda env export > environment.yml
conda env create -f environment.yml
完整环境快照 阶段16 —
查某个包的版本 版本 version import importlib.metadata as md
md.version("numpy")
用于排查 阶段16 —

本机常用命令速记(你的 Python 在 miniconda 里):

# 跑脚本
~/miniconda3/bin/python script.py

# 装包
~/miniconda3/bin/python -m pip install 包名

# 看版本
~/miniconda3/bin/python -c "import sys; print(sys.version)"

11 怎么练这张表

别背。 这张表是用来查的。真正的掌握方式是:

步 做什么
1 遇到问题时先来这张表搜(Cmd+F 搜关键词那一列)
2 找到了就抄过去用,改一个变量名试试
3 用着用着你就记住了,这是提取练习(阶段 14 讲过)
4 表里查不到的,去 Python 官方文档 或 pandas 文档 搜

⭐ 记住这张表的存在,比记住表里每一行重要得多。
知道"有这么一个东西可以用",就已经解决了一半问题。


12 自检

这张表里的代码写法都在四篇笔记里实跑验证过。想自己复现:

cd ~/Desktop/大一/编程/教材
~/miniconda3/bin/python 自检脚本.py

它会核验笔记里各条结论(别名共享、可变默认参数、广播、向量化加速、随机种子等)。

另外,全站自检可以跑:

~/miniconda3/bin/python ~/Desktop/大一/验证.py
最后更新:2026-09-26