python - 在赋值错误python 3之前引用的局部变量
问题描述
对于上下文,我正在尝试创建一个程序来计算任何给定化合物的质量。
当我运行以下代码时,我收到此错误:
Traceback (most recent call last):
File "/Users/robertg21/PycharmProjects/MolecularMassCalculator/MolecularMassCalculator.py", line 37, in <module>
formula.insert(return_index(), "+")
File "/Users/robertg21/PycharmProjects/MolecularMassCalculator/MolecularMassCalculator.py", line 31, in return_index
return pos
UnboundLocalError: local variable 'pos' referenced before assignment
任何人都可以帮忙。这是我的代码:
# This program calculates the molar mass of a compound given its chemical formula and number of atoms.
relative_atomic_mass = {'H': 1.00794, 'He': 4.002602, 'Li': 6.941, 'Be': 9.012182, 'B': 10.811, 'C': 12.0107, 'N': 14.0067,
'O': 15.9994, 'F': 18.9984032, 'Ne': 20.1797, 'Na': 22.98976928, 'Mg': 24.305, 'Al': 26.9815386,
'Si': 28.0855, 'P': 30.973762, 'S': 32.065, 'Cl': 35.453, 'Ar': 39.948, 'K': 39.0983, 'Ca': 40.078,
'Sc': 44.955912, 'Ti': 47.867, 'V': 50.9415, 'Cr': 51.9961, 'Mn': 54.938045,
'Fe': 55.845, 'Co': 58.933195, 'Ni': 58.6934, 'Cu': 63.546, 'Zn': 65.409, 'Ga': 69.723, 'Ge': 72.64,
'As': 74.9216, 'Se': 78.96, 'Br': 79.904, 'Kr': 83.798, 'Rb': 85.4678, 'Sr': 87.62, 'Y': 88.90585,
'Zr': 91.224, 'Nb': 92.90638, 'Mo': 95.94, 'Tc': 98.9063, 'Ru': 101.07, 'Rh': 102.9055, 'Pd': 106.42,
'Ag': 107.8682, 'Cd': 112.411, 'In': 114.818, 'Sn': 118.71, 'Sb': 121.760, 'Te': 127.6,
'I': 126.90447, 'Xe': 131.293, 'Cs': 132.9054519, 'Ba': 137.327, 'La': 138.90547, 'Ce': 140.116,
'Pr': 140.90465, 'Nd': 144.242, 'Pm': 146.9151, 'Sm': 150.36, 'Eu': 151.964, 'Gd': 157.25,
'Tb': 158.92535, 'Dy': 162.5, 'Ho': 164.93032, 'Er': 167.259, 'Tm': 168.93421, 'Yb': 173.04,
'Lu': 174.967, 'Hf': 178.49, 'Ta': 180.9479, 'W': 183.84, 'Re': 186.207, 'Os': 190.23, 'Ir': 192.217,
'Pt': 195.084, 'Au': 196.966569, 'Hg': 200.59, 'Tl': 204.3833, 'Pb': 207.2, 'Bi': 208.9804,
'Po': 208.9824, 'At': 209.9871, 'Rn': 222.0176, 'Fr': 223.0197, 'Ra': 226.0254, 'Ac': 227.0278,
'Th': 232.03806, 'Pa': 231.03588, 'U': 238.02891, 'Np': 237.0482, 'Pu': 244.0642, 'Am': 243.0614,
'Cm': 247.0703, 'Bk': 247.0703, 'Cf': 251.0796, 'Es': 252.0829, 'Fm': 257.0951, 'Md': 258.0951,
'No': 259.1009, 'Lr': 262, 'Rf': 267, 'Db': 268, 'Sg': 271, 'Bh': 270, 'Hs': 269, 'Mt': 278,
'Ds': 281, 'Rg': 281, 'Cn': 285, 'Nh': 284, 'Fl': 289, 'Mc': 289, 'Lv': 292, 'Ts': 294, 'Og': 294,
}
chemical_formula = input("Enter chemical formula, or press return to quit: ")
formula = list(chemical_formula)
def return_index():
for element in formula:
if element.isalpha() and element.isupper():
pos = formula.index(element)
return pos
# Inserts + before for each Capitalized letter in list.
for item in formula:
if item.isalpha() and item.isupper():
formula.insert(return_index(), "+")
谢谢。
解决方案
信息很明确:
if element.isalpha() and element.isupper():
pos = formula.index(element)
return pos
如果条件不满足怎么办?
pos
如果要返回或引用它,则必须设置为某个值。
也许你想要:
if element.isalpha() and element.isupper():
return formula.index(element)
这将使循环短路,创建一个简单的“查找”操作。如果条件从未满足,它将返回None
。
可以使用表达您创建的相同结构的更实用的方法。具体而言,您创建find
或first
具有以下形式:
for item in coll
if pred(item)
return item
所以你可以定义pred
和使用next(filter(pred, coll))
相同的效果:
def is_element(element):
return item.isalpha() and item.isupper()
接着:
element = next(filter(is_element, formula))
推荐阅读
- git - 以故障安全的方式检查远程分支,丢弃本地更改?
- android - 如何使用 Retrofit 2 从 Dropbox 下载文件
- git - 如何仅使用文件夹创建存储库?
- java - 由于 serializationVersionUID 警告,无法完成构建
- android - Coordinatorlayout 不适用于包含的工具栏
- maven - Maven gpg:跳过“39619BDF”:没有密钥
- spring-boot - Spring data jpa 在自定义选择上上升 NullPointerException
- data-structures - 如何确保 Rust 向量仅包含交替类型?
- .net - 自定义标头 powershell invoke-webrequest
- c# - 我面临基础设施超翼的问题