<p>这里提供的答案集中在解决问题的两个不同方面:</p>
<ol>
<li>一个非常具体的错误解决方案(<code>int is not iterable</code>),通过纠正一些代码。在</li>
<li>对如何处理代码有一个更大的视角。在</li>
</ol>
<p>关于<strong>1</strong>,您的问题的一个注释指出了这个问题:内部循环中元组解包的语法。
元组解包的一个例子是</p>
<pre><code>a,b = ['a','b']
</code></pre>
<p>在这里,Python将获取右手边(RHS)的第一个元素,并将其分配给左手边的第一个名称(LHS),即RHS的第二个元素,并将其分配给LHF中的第二个名称。在</p>
<p>你的内环出了问题,
<code>for index, y in range(index + 1, 1000000000)</code>,
相当于试着去做</p>
^{pr2}$
<p>现在,整数不是元素的集合,所以这行不通。在</p>
<p>关于<strong>2</strong>,您应该关注<strong>模块化的策略,这基本上意味着您为每个子问题编写一个函数。Python几乎就是为此而生的。(注意,这种策略并不一定意味着为每个子问题编写Python模块。)</p>
<p>在您的情况下,您的主要目标可以分为几个子问题:</p>
<ol>
<li>得到分子序列。在</li>
<li>把序列分成单独的序列。在</li>
<li>把序列分成H,C和O元素。在</li>
<li>给定氢、碳和氧原子的数目,计算分子量。在</li>
</ol>
<p>第3步和第4步是独立函数的最佳候选,因为它们的核心问题与其余的上下文无关。在</p>
<p>在这里,我假设我们一次只能得到一个序列,并且它们的形式可以是:</p>
<ul>
<li><code>CH4</code></li>
<li><code>CHHHH</code></li>
<li><code>CP4H3OH</code></li>
</ul>
<p>第三步:</p>
<pre><code>def GetAtoms(sequence):
'''
Counts the number of C's, H's and O's in sequence and returns a dictionary.
Only works with a numeric suffices up to 9, e.g. C10H12 would not work.
'''
atoms = ['C','H','O'] # list of which atoms we want to count.
res = {atom:0 for atom in atoms}
last_c = None
for c in sequence:
if c in atoms:
res[c] += 1
last_c = c
elif c.isdigit() and last_c is not None:
res[last_c] += int(c) - 1
last_c = None
else:
last_c = None
return res
</code></pre>
<p>你可以看到,不管你如何获得序列和如何计算分子量,这个方法都是有效的(前提条件下)。如果以后需要扩展如何获得原子计数的功能,可以在不影响其余逻辑的情况下进行更改。在</p>
<p>第四步:</p>
<pre><code>def MolecularWeight(atoms):
return atoms['H']*1 + atoms['C']*8 + atoms['O']*18
</code></pre>
<p>现在你的逻辑是:</p>
<pre><code>while True:
chemicalFormula = input("Enter the chemical formula, or enter key to quit: ")
if len(chemicalFormula) == 0:
break
print 'Molecular weight of', chemicalFormula, 'is', MolecularWeight(GetAtoms(chemicalFormula))
</code></pre>