Python循环内使用字典布尔值 后续迭代无返回值问题求解
问题根源
你的推测完全正确,代码问题出在首次循环中直接修改了存储氨基酸pKa常数的aaDic字典,将原本的浮点数值全部覆盖为布尔值。后续循环读取aaDic中取值时,已经不是原始的解离常数值,自然无法得到正确的计算结果。
修复方案
核心原则是将存储pKa的原始字典作为只读常量,全程不修改它的取值。每次循环需要判断氨基酸质子化状态时直接基于原始pKa实时计算即可,无需写入原字典。
修改后的可运行代码
# 该字典为只读常量,全程不修改取值 aaDic = { 'Arg': 12.48, 'Asp': 3.90, 'Cys': 8.37, 'Glu': 4.07, 'His': 6.04, 'Lys': 10.54, 'Tyr': 10.46, } while True: x = input("Enter pH of buffer (enter q to exit): ") # 增加退出逻辑 if x.lower() == 'q': break y = input("Enter three letter code for an amino acid: ") ph_val = float(x) target_pka = aaDic[y] # 判断输入氨基酸的质子化状态,保留原逻辑 if ph_val > target_pka: ProtonationInput = True elif ph_val < target_pka: ProtonationInput = False else: print("pH等于pKa时氨基酸处于半解离状态,无明确相互作用残基") continue print("\n") print("Is your amino acid,", y, ", protonated?", ProtonationInput, "\n") print("At pH", x, y, "likely interacts with the following residues: \n") # 直接遍历原始字典实时计算每个氨基酸的质子化状态,不修改原字典 for aa, pka in aaDic.items(): if ph_val > pka: aa_protonated = True elif ph_val < pka: aa_protonated = False else: # 跳过pH等于pKa的边界情况 continue # 带电相反可发生静电相互作用 if ProtonationInput != aa_protonated: print(aa, "\n")
额外优化说明
- 增加了退出逻辑,输入
q即可结束程序,无需强制终止 - 补充了pH等于pKa的边界情况处理,避免出现变量未定义的报错
- 统一提前将输入pH转为浮点数,避免重复转换提升效率
内容的提问来源于stack exchange,提问作者meh47336
相关产品推荐
相关产品推荐

