恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
生化要点总结:用Python构建代谢网络知识库
首页
资讯中心
/
生化要点总结:用Python构建代谢网络知识库
生化要点总结:用Python构建代谢网络知识库
发布时间:2026/10/15 9:45:54
简介这份生化要点总结文档面向生物化学初学者、备考学生及需要快速梳理知识框架的读者帮助解决生化内容庞杂、知识点零散、复习无从下手的问题。资源包内含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_atp2.5, fadh2_atp1.5, shuttlemalate_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(shuttleglycerol_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_existsreplace, indexFalse) # 建索引按底物、产物、通路分别建 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_existsreplace表示每次跑都重建表适合数据还在调整的阶段稳定后改成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_eqA_eq, b_eqb_eq, boundsbounds, methodhighs) if res.success: print(最大目标通量:, -res.fun) print(通量分布:, res.x) else: print(无可行解检查边界和计量矩阵)逻辑说明linprog求的是最小化所以目标系数取负来最大化。A_eq和b_eq是稳态约束bounds是每个反应的通量范围。参数上bounds要根据实际酶活和热力学设全设 0 到 1000 只是演示。如果无可行解通常是计量矩阵有误或边界太紧。跑通之后你可以改目标函数看不同条件下哪些通路被激活这就是用计算验证要点总结的方法。5.3 一个我常犯的错误我早期做代谢整理时总想把所有反应都录进去觉得越全越好。结果数据库几千条反应查询慢而且大部分反应在特定条件下根本不活跃。后来我改成一个习惯先录核心通路糖酵解、TCA、氧化磷酸化、尿素循环、脂肪酸氧化跑通 FBA再按需要逐步加外围通路。这样每次加新数据都能看到对通量的影响而不是堆一堆用不上的反应。另一个习惯是每次改完反应表先跑一遍度数统计和最短路径看接口节点有没有变。如果某个代谢物度数突然升高说明新加的反应把它变成了新的接口这时候要回头检查命名和计量有没有错。这个习惯帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取