<p>有几件事:</p>
<ul>
<li>在交换s1和s2之前,您需要计算<code>m</code>和<code>n</code>的长度,因此它们不一定再匹配</李>
<li>在for循环中有一个<code>i+=1</code>,它什么都不做</li>
<li>您正在使用<code>sum</code>作为变量名,隐藏内置的sum函数</李>
</ul>
<p>我建议改写如下:</p>
<pre><code>def stringadd(s1, s2):
shorter, longer = (x[::-1] for x in sorted((s1, s2), key=len))
carry = 0
result = ""
for i in range(len(shorter)):
s = (ord(shorter[i]) - 48) + (ord(longer[i]) - 48) + carry
result += chr((s % 10) + 48)
carry = int(s / 10)
for i in range(len(shorter), len(longer)):
s = (ord(longer[i]) - 48) + carry
result += chr(s % 10 + 48)
carry = int(s / 10)
if (carry):
result += chr(carry + 48)
return result[::-1]
if __name__ == '__main__':
print(stringadd("32134", "23456782"))
assert(32134 + 23456782 == int(stringadd("32134", "23456782")))
print(stringadd("999", "9"))
assert(999 + 9 == int(stringadd("999", "9")))
</code></pre>
<p>其中一些优势:</p>
<ul>
<li>更具描述性的变量名</li>
<li>使用<code>len(shorter)</code>或<code>len(longer)</code>而不是<code>n</code>和<code>m</code>来明确其含义</li>
</ul>
<p>您甚至可以用<code>ord("0")</code>替换神奇常数<code>48</code>,以更清楚地说明该数字的作用。为了好玩,我们还可以使用更实用的风格:</p>
<pre><code>from functools import reduce
def stringadd2(s1, s2):
# Make s1 and s2 the same length by appending 0s to the reversed string,
# then pair them up.
digits = zip(s1[::-1] + "0" * (max(len(s1), len(s2)) - len(s1)),
s2[::-1] + "0" * (max(len(s1), len(s2)) - len(s2)))
# The function for our reducer which has state in part and gets each pair
# of digits in x iteratively.
def add(part, x):
s = (ord(x[0]) - ord("0")) + (ord(x[1]) - ord("0")) + part[1]
return part[0] + chr((s % 10) + ord("0")), int(s / 10)
result, carry = reduce(add, digits, ("", 0))
if carry:
result += chr(ord("0") + carry)
return ''.join(result[::-1])
</code></pre>