简介:这份生化要点总结文档面向生物化学初学者、备考学生及需要快速梳理知识框架的读者,帮助解决生化内容庞杂、知识点零散、复习无从下手的问题。资源包内含1个doc文件,约426KB,以文字笔记形式系统整理生化核心内容,便于打印或电子阅读。文档从生物化学的概念与研究对象切入,梳理了静态生化与动态生化两大部分,并沿时间线回顾学科发展史,涵盖拉瓦锡的呼吸氧化研究、维勒人工合成尿素、施来登与施旺的细胞学说、李比西提出新陈代谢、巴斯德发酵研究,以及二十世纪维生素、激素、酶和DNA双螺旋等重要节点。同时涉及蛋白质、脂类、碳水化合物、核酸等研究对象,以及实验、分析、模型等研究方法,并延伸至医药、农业、环境保护等应用领域。目前已有730人学习,适合用于课程预习、期末复习和考研知识框架搭建。
1. 生化要点把一些生化要点都总结:为什么你背了三年代谢通路还是串不起来
如果你正在准备生化考试、做代谢工程课题,或者带学生做生化实验,大概率遇到过这个场景:糖酵解、三羧酸循环、氧化磷酸化、氨基酸代谢、核苷酸代谢,单独拎出来每个都能说两句,但一旦题目问“葡萄糖里的碳原子最终去了哪里”“为什么缺铁会让人乏力”“丙氨酸转氨酶升高到底意味着什么”,脑子里的通路图就碎成一地。问题不在记忆力,在于你手里那堆“生化要点”是散装的,没有按能量流、碳骨架流、氮流三条主线串起来。
这篇笔记要做的,就是把“生化要点总结”这件事从抄笔记升级成建索引。我会按代谢网络的实际连接逻辑,把糖代谢、脂代谢、氨基酸代谢、核苷酸代谢和氧化磷酸化之间的接口讲清楚,再给出一套可以自己动手跑的整理方法——用 Python 把通路数据做成可查询的本地知识库,而不是继续在笔记本上画箭头。适合三类人:备考生化需要抓主干的学生、做代谢工程需要快速查接口的工程师、以及带实验课需要给学生讲清楚“为什么这个酶突变会致死”的导师。下面从最容易被忽略的“能量货币换算”开始拆。
2. 代谢网络的三条主线:碳流、能量流、氮流怎么接
2.1 为什么按通路背没用,按接口背才有用
大多数教材按“糖代谢—脂代谢—氨基酸代谢”分章,这是教学方便,不是代谢本身的组织方式。细胞里真正在跑的是一个有向图:节点是代谢物,边是酶促反应。你背“糖酵解有十步”只是在背一条边的序列,但考试和科研问的是“这个节点被哪些边共享”。
举个具体例子:磷酸二羟丙酮(DHAP)是糖酵解中间产物,同时是甘油三酯合成的原料;草酰乙酸(OAA)是三羧酸循环中间产物,同时是转氨作用的碳骨架受体;α-酮戊二酸(α-KG)是三羧酸循环中间产物,同时是谷氨酸脱氨基的产物。这三个节点就是碳流和氮流的接口。你只要记住接口节点,就能把看似无关的通路串起来。
我一般会让学生先做一件事:把代谢图里度数最高的前 20 个节点列出来。这些节点就是“生化要点”的真正骨架。具体操作可以用 Python 读一个代谢反应表,统计每个代谢物出现在多少条反应里。下面是一个最小可跑的例子。
# 用反应表统计代谢物度数,找出接口节点 # 输入:reactions.csv,两列 substrate, product import pandas as pd from collections import Counter df = pd.read_csv("reactions.csv") # 统计每个代谢物作为底物和产物的总出现次数 counter = Counter() for _, row in df.iterrows(): counter[row["substrate"]] += 1 counter[row["product"]] += 1 # 输出度数最高的前20个节点 for metabolite, degree in counter.most_common(20): print(f"{metabolite}\t{degree}")这段代码的逻辑很简单:度数越高,说明这个代谢物参与的反应越多,越可能是通路之间的接口。参数上,reactions.csv至少要有底物和产物两列,如果你从公开数据库导出,列名可能不同,改一下row["substrate"]里的键就行。跑完你会看到 ATP、NADH、NADPH、丙酮酸、乙酰辅酶A、α-酮戊二酸、谷氨酸、草酰乙酸这些名字排在前列。这就是你该优先背的“生化要点”。
提示:不要一上来就统计全部代谢物,先把辅因子(ATP、NADH、NADPH、FADH2、CoA)单独拎出来,它们度数最高但属于能量流主线,和碳骨架接口要分开看。
2.2 能量货币换算:ATP 到底怎么算才不会乱
生化要点里最容易出错的就是 ATP 产额。糖酵解净产 2 ATP 和 2 NADH,三羧酸循环每轮产 3 NADH、1 FADH2、1 GTP,氧化磷酸化里 NADH 按 2.5 ATP 算、FADH2 按 1.5 ATP 算。但很多人背了数字却不知道这些数字怎么来的,题目一变形就翻车。
关键在两点:第一,NADH 和 FADH2 的 ATP 换算系数不是整数,因为质子泵的化学计量比和 ATP 合酶的 c 环数目因物种而异;第二,糖酵解产生的 NADH 在细胞质,要进入线粒体氧化必须经过穿梭系统,不同穿梭系统给出的 ATP 数不同。常见做法是:苹果酸-天冬氨酸穿梭按 2.5 ATP 算,甘油-3-磷酸穿梭按 1.5 ATP 算。所以同样一分子葡萄糖,在不同组织里完全氧化产额可以差 2 个 ATP。
我一般会让学生自己算一遍,而不是背“30 或 32”。下面是一个计算脚本,把各阶段产额和穿梭系数作为参数,方便你改。
# 计算一分子葡萄糖完全氧化的ATP产额 # 参数:nadh_atp 和 fadh2_atp 按物种/组织调整 def atp_yield(nadh_atp=2.5, fadh2_atp=1.5, shuttle="malate_aspartate"): # 糖酵解:净2 ATP + 2 NADH(细胞质) atp = 2 # 细胞质NADH经穿梭进入线粒体 if shuttle == "malate_aspartate": atp += 2 * nadh_atp elif shuttle == "glycerol_phosphate": atp += 2 * fadh2_atp # 丙酮酸脱氢酶:2 NADH atp += 2 * nadh_atp # 三羧酸循环:每轮3 NADH + 1 FADH2 + 1 GTP,共2轮 atp += 2 * (3 * nadh_atp + 1 * fadh2_atp + 1) return atp print("苹果酸-天冬氨酸穿梭:", atp_yield()) print("甘油-3-磷酸穿梭:", atp_yield(shuttle="glycerol_phosphate"))逻辑说明:函数把每个产 NADH/FADH2 的步骤单独列出,乘以对应换算系数,GTP 直接按 1 ATP 计。参数nadh_atp和fadh2_atp是你要根据题目或物种改的,shuttle控制细胞质 NADH 的路径。跑出来你会看到 30 和 28 两个数,这就是为什么不同教材数字不一样。把这个脚本留着,考试前改参数验证,比背数字靠谱。
2.3 氮流接口:转氨作用和尿素循环的衔接点
氮代谢的要点不是背尿素循环五步,而是搞清楚氨基从哪来、到哪去。氨基酸脱氨基把氨基交给 α-酮戊二酸生成谷氨酸,谷氨酸再交给草酰乙酸生成天冬氨酸,这两个转氨反应就是氮流和碳流的交叉点。天冬氨酸把氮送进尿素循环,草酰乙酸回到三羧酸循环,谷氨酸脱氢酶释放游离氨。
这里有个常见误解:以为尿素循环只在肝里跑。实际上天冬氨酸-精氨酸琥珀酸分流在多数组织里都有,只是肝里完整尿素循环才全。做代谢工程时如果要在微生物里提高氨基酸产量,改的就是这些转氨酶的表达量,而不是尿素循环本身。
我一般会用一个简单的表格来整理氮流接口,比画箭头清楚:
| 接口代谢物 | 碳骨架去向 | 氮去向 | 关键酶 |
|---|---|---|---|
| 谷氨酸 | α-酮戊二酸进 TCA | 游离氨或转氨 | 谷氨酸脱氢酶 |
| 天冬氨酸 | 草酰乙酸进 TCA | 尿素循环 | 天冬氨酸转氨酶 |
| 丙氨酸 | 丙酮酸进糖异生 | 尿素循环 | 丙氨酸转氨酶 |
| 谷氨酰胺 | α-酮戊二酸 | 肾脏排氨 | 谷氨酰胺酶 |
这张表的价值在于:你看到丙氨酸转氨酶升高,就知道是丙氨酸和丙酮酸之间的转氨接口在动,背后连着糖异生和尿素循环两条线。比单独背“ALT 催化丙氨酸和 α-酮戊二酸生成丙酮酸和谷氨酸”有用得多。
3. 用 Python 把散装生化要点做成可查询本地库
3.1 数据从哪来:自己整理还是用公开通路数据
做本地知识库第一步是数据。常见做法有三种:一是从公开代谢数据库导出反应表,二是从教材附录手动录入,三是用现成的通路文件解析。我一般推荐混合:核心通路(糖酵解、TCA、氧化磷酸化、尿素循环)手动录入,保证准确;外围通路用公开数据补充,保证覆盖。
手动录入的格式建议用 CSV,列包括:反应 ID、底物、产物、酶、EC 编号、通路归属、是否可逆。下面是一个最小示例,你可以直接存成core_pathways.csv。
reaction_id,substrate,product,enzyme,ec,pathway,reversible G1,glucose,glucose_6_phosphate,hexokinase,2.7.1.1,glycolysis,no G2,glucose_6_phosphate,fructose_6_phosphate,phosphoglucose_isomerase,5.3.1.9,glycolysis,yes G3,fructose_6_phosphate,fructose_1_6_bisphosphate,phosphofructokinase,2.7.1.11,glycolysis,no T1,oxaloacetate, citrate, citrate_synthase,2.3.3.1,tca,no T2,citrate,isocitrate,aconitase,4.2.1.3,tca,yes逻辑说明:reaction_id是主键,substrate和product用统一命名(建议全小写、下划线分隔),reversible标记可逆性,后面做路径搜索时要用。参数上,EC 编号可以留空,但通路归属必须填,否则查询时没法按通路过滤。
注意:代谢物命名不统一是最大的坑。比如“α-酮戊二酸”有人写 alpha_ketoglutarate,有人写 2_oxoglutarate。建议一开始就定一个命名表,所有数据都按这个表来,不然后面合并数据会疯。
3.2 建库:用 SQLite 存反应表并建索引
数据整理好之后,用 SQLite 建一个本地库,好处是不用装服务器,一个文件带走,查询用 SQL 就行。下面是把 CSV 导入 SQLite 并建索引的脚本。
import sqlite3 import pandas as pd # 读入CSV df = pd.read_csv("core_pathways.csv") # 连接数据库(不存在会自动创建) conn = sqlite3.connect("biochem.db") cursor = conn.cursor() # 建表 cursor.execute(""" CREATE TABLE IF NOT EXISTS reactions ( reaction_id TEXT PRIMARY KEY, substrate TEXT, product TEXT, enzyme TEXT, ec TEXT, pathway TEXT, reversible TEXT ) """) # 写入数据 df.to_sql("reactions", conn, if_exists="replace", index=False) # 建索引:按底物、产物、通路分别建 cursor.execute("CREATE INDEX IF NOT EXISTS idx_substrate ON reactions(substrate)") cursor.execute("CREATE INDEX IF NOT EXISTS idx_product ON reactions(product)") cursor.execute("CREATE INDEX IF NOT EXISTS idx_pathway ON reactions(pathway)") conn.commit() conn.close() print("建库完成")逻辑说明:to_sql的if_exists="replace"表示每次跑都重建表,适合数据还在调整的阶段;稳定后改成"append"并加去重逻辑。三个索引分别对应三种查询场景:查某个代谢物由什么生成、查某个代谢物被什么消耗、查某条通路的所有反应。参数上,biochem.db是数据库文件名,你可以改成自己的路径。
3.3 查询:找接口节点和最短路径
建完库之后,最有用的两个查询是:找某个代谢物的所有上下游反应,以及找两个代谢物之间的最短路径。前者用 SQL 就行,后者需要写个简单的广度优先搜索。
import sqlite3 from collections import deque def get_neighbors(metabolite): conn = sqlite3.connect("biochem.db") cursor = conn.cursor() # 作为底物的反应:下游 cursor.execute("SELECT product, enzyme, pathway FROM reactions WHERE substrate=?", (metabolite,)) downstream = cursor.fetchall() # 作为产物的反应:上游 cursor.execute("SELECT substrate, enzyme, pathway FROM reactions WHERE product=?", (metabolite,)) upstream = cursor.fetchall() conn.close() return upstream, downstream def shortest_path(start, end): conn = sqlite3.connect("biochem.db") cursor = conn.cursor() cursor.execute("SELECT substrate, product FROM reactions") edges = cursor.fetchall() conn.close() # 建邻接表 graph = {} for s, p in edges: graph.setdefault(s, []).append(p) # BFS queue = deque([(start, [start])]) visited = {start} while queue: node, path = queue.popleft() if node == end: return path for neighbor in graph.get(node, []): if neighbor not in visited: visited.add(neighbor) queue.append((neighbor, path + [neighbor])) return None # 示例:查丙酮酸的上游和下游 up, down = get_neighbors("pyruvate") print("丙酮酸上游:", up) print("丙酮酸下游:", down) # 示例:查葡萄糖到α-酮戊二酸的最短路径 print("路径:", shortest_path("glucose", "alpha_ketoglutarate"))逻辑说明:get_neighbors直接查 SQL,返回上游和下游反应列表,适合快速看某个代谢物的接口。shortest_path用 BFS 在反应图上找最短路径,返回代谢物序列。参数上,代谢物名称必须和数据库里一致,否则查不到。跑出来你会看到葡萄糖到 α-酮戊二酸要经过糖酵解、丙酮酸脱氢、TCA 前几步,这条路径就是碳流主干。
提示:BFS 找的是最少步数路径,不是热力学可行路径。真实代谢里有些反应不可逆,路径搜索时要加
reversible过滤,否则会找到理论上存在但细胞里跑不通的路线。
4. 避坑:整理生化要点时最容易翻车的五个地方
4.1 把辅因子当普通代谢物统计
现象:用度数统计接口节点时,ATP、NADH、NADPH、CoA 排在最前面,导致你误以为它们是核心碳骨架节点。原因:这些辅因子参与大量反应,但它们是能量流和电子流的载体,不是碳骨架。解决:统计前先把辅因子列表单独拎出来,或者按通路过滤,只看碳代谢相关反应。
4.2 忽略区室化导致路径算错
现象:脚本算出细胞质 NADH 直接进氧化磷酸化产 2.5 ATP,但实际要经穿梭系统。原因:数据库里没有区室信息,反应图是扁平的。解决:在反应表里加compartment列,路径搜索时限制在同一区室或已知穿梭反应内。真核细胞尤其要注意线粒体和细胞质的分隔。
4.3 代谢物命名不统一导致查不到
现象:查alpha_ketoglutarate返回空,但数据库里存的是2_oxoglutarate。原因:不同来源命名习惯不同。解决:建一个别名表,查询前先做名称归一化。常见做法是维护一个synonyms.csv,两列:标准名、别名,查询时先查别名表映射。
4.4 把可逆反应当单向导致路径断裂
现象:找糖异生路径时,BFS 找不到从丙酮酸到葡萄糖的路线。原因:糖酵解有三步不可逆,糖异生走的是旁路反应,数据库里如果只存糖酵解反应且标记不可逆,反向搜索就断了。解决:糖异生旁路反应要单独录入,比如丙酮酸羧化酶、PEP 羧激酶、果糖-1,6-二磷酸酶、葡萄糖-6-磷酸酶。
4.5 忘记调控点导致要点总结没有重点
现象:整理了几百条反应,但考试和科研问的都是调控点。原因:代谢要点不只是反应列表,还包括限速步骤和别构调控。解决:在反应表里加is_regulatory列,标记限速酶,查询时优先看这些。糖酵解的三个调控点、TCA 的柠檬酸合酶和异柠檬酸脱氢酶、氧化磷酸化的电子传递链复合体,都是必标。
5. 进阶:用通量平衡分析验证你的要点总结
5.1 从反应表到化学计量矩阵
整理完反应表之后,进阶做法是把它转成化学计量矩阵,用通量平衡分析(FBA)验证哪些通路在给定条件下是通的。这一步不需要复杂工具,用 Python 的numpy和scipy就能做最小版本。化学计量矩阵的行是代谢物,列是反应,元素是化学计量系数,底物为负、产物为正。
import numpy as np import pandas as pd # 从数据库读反应,构建化学计量矩阵 import sqlite3 conn = sqlite3.connect("biochem.db") df = pd.read_sql("SELECT * FROM reactions", conn) conn.close() # 收集所有代谢物 metabolites = sorted(set(df["substrate"]) | set(df["product"])) met_index = {m: i for i, m in enumerate(metabolites)} reactions = df["reaction_id"].tolist() reaction_index = {r: i for i, r in enumerate(reactions)} # 初始化矩阵 S = np.zeros((len(metabolites), len(reactions))) for _, row in df.iterrows(): j = reaction_index[row["reaction_id"]] S[met_index[row["substrate"]], j] -= 1 S[met_index[row["product"]], j] += 1 print("矩阵维度:", S.shape) print("代谢物数:", len(metabolites), "反应数:", len(reactions))逻辑说明:S矩阵是 FBA 的核心输入,行对应代谢物,列对应反应。底物系数为负、产物为正,这是标准约定。参数上,如果反应有化学计量数不是 1,比如 2 分子底物,要在-= 1改成-= 2。跑完你会看到矩阵维度,比如 50 个代谢物、60 个反应,说明你的网络规模。
5.2 用简单线性规划找可行通量
有了S矩阵,假设稳态下S·v = 0,再给每个反应设上下界,就可以用线性规划找可行通量分布。下面是一个最小例子,目标设为最大化某个产物通量。
from scipy.optimize import linprog # 假设目标反应是最后一个,最大化其通量 n_reactions = S.shape[1] # 目标函数:最大化最后一个反应,linprog默认求最小,所以取负 c = np.zeros(n_reactions) c[-1] = -1 # 等式约束:S·v = 0 A_eq = S b_eq = np.zeros(S.shape[0]) # 边界:所有反应通量在0到1000之间 bounds = [(0, 1000) for _ in range(n_reactions)] # 求解 res = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method="highs") if res.success: print("最大目标通量:", -res.fun) print("通量分布:", res.x) else: print("无可行解,检查边界和计量矩阵")逻辑说明:linprog求的是最小化,所以目标系数取负来最大化。A_eq和b_eq是稳态约束,bounds是每个反应的通量范围。参数上,bounds要根据实际酶活和热力学设,全设 0 到 1000 只是演示。如果无可行解,通常是计量矩阵有误或边界太紧。跑通之后,你可以改目标函数,看不同条件下哪些通路被激活,这就是用计算验证要点总结的方法。
5.3 一个我常犯的错误
我早期做代谢整理时,总想把所有反应都录进去,觉得越全越好。结果数据库几千条反应,查询慢,而且大部分反应在特定条件下根本不活跃。后来我改成一个习惯:先录核心通路(糖酵解、TCA、氧化磷酸化、尿素循环、脂肪酸氧化),跑通 FBA,再按需要逐步加外围通路。这样每次加新数据都能看到对通量的影响,而不是堆一堆用不上的反应。
另一个习惯是每次改完反应表,先跑一遍度数统计和最短路径,看接口节点有没有变。如果某个代谢物度数突然升高,说明新加的反应把它变成了新的接口,这时候要回头检查命名和计量有没有错。这个习惯帮我省了很多后悔药。
希望帮到你。
本文还有配套的精品资源,点击获取