<p>有两件事需要解决:</p>
<ol>
<li><p>您需要正确地处理初始值;当初始值为非负时,这将失败。在循环之前,设置<code>j = '+'</code>,这样就添加了一个无符号前缀的值(同样,对于样式点,<code>j</code>是一个糟糕的名称,可以使用<code>op</code>或其他什么吗?)。</p></li>
<li><p>不能将变量用作运算符。</p></li>
</ol>
<p>替换:</p>
<pre><code>result = result j i
</code></pre>
<p>使用:</p>
<pre><code>if j == '+':
result += i
else:
result -= i
</code></pre>
<p>注:如果允许使用模块,则可以使用泛化方法以“良好”的方式处理运算符(尽管需要更多的工作来遵守运算符优先级)。你应该定义:</p>
<pre><code>import operator
ops = {'+': operator.add, '-': operator.sub, ...}
</code></pre>
<p>然后将初始值设为<code>op</code><code>operator.add</code>,并将运算符的测试更改为:</p>
<pre><code>if i in ops:
op = ops[i]
else:
result = op(result, int(i))
</code></pre>
<p>它可以扩展到更多的操作符,动态选择要执行的操作,而无需级联<code>if</code>/<code>elif</code>检查。你知道吗</p>
<p>旁注:虽然违反了挑战的精神,<a href="https://docs.python.org/3/library/ast.html#ast.literal_eval" rel="nofollow">^{<cd8>}</a>(至少在python3.5中是这样,这可能会改变,请参见<a href="http://bugs.python.org/issue22525" rel="nofollow">bug #22525</a>)实际上会安全地解析这样的字符串(<code>eval</code>是不安全的,因为它可以执行任意代码,但是<code>ast.literal_eval</code>只能解析Python文本,显然还有一些基本的编译时数学)。所以你可以做:</p>
<pre><code>import ast
ans = ast.literal_eval
</code></pre>
<p>当然,它也处理许多其他文本,但是我们从来没有定义过失败案例行为。:-)</p>