<p>实现这一点最具python风格的方式是作为列表理解,它只是一行</p>
<pre><code>>>> [(a[i],a[j]) for i in range(0, len(a)-1) for j in range(i+1, len(a)-1) if a[i]+a[j]==target]
[(4, 5), (10, -1)]
</code></pre>
<p>(请注意,这有助于提前终止,但您可以只分割第[0]个元素。)</p>
<p>关于您的代码/函数方法,我将其改写为(下次请要求对<a href="https://codereview.stackexchange.com/questions/tagged/python">CodeReview.SE</a>上的工作代码进行审查,而不是在这里进行审查):</p>
<pre><code>def two_sum (a, target):
for i in range(0, len(a)):
for j in range( i + 1, len(a)):
if a[i] + a[j] == target:
return (a[i], a[j])
return None
result = two_sum (a, target)
if result:
print ("the numbers sum to target", result)
else:
print ("result is not in range")
</code></pre>
<p>评论:</p>
<ul>
<li>由于您调用第一个索引i,<strong>调用第二个索引j,而不是x,这就不清楚x是值还是索引</li>
<li>返回None比返回-1这样的哨兵值更像python。然后调用方只需使用<code>if result:</code>测试返回值,您不需要任何笨重的<code>if result != -1</code>或<code>if result is None</code></li>
<li>将<code>twoSum</code>重命名为<strong><code>two_sum</code></strong>以遵循函数名和变量的Python命名约定(PEP-8):小写字母带下划线</li>
<li>注意,此实现不会提前终止。但是,如果您只是将<code>return (a[i], a[j])</code>更改为<code>yield (a[i], a[j])</code>,这将使它成为一个按顺序返回所有(/any)匹配元组的生成器。(您需要将<code>return None</code>替换为<code>yield StopIteration</code>)</li>
<li>类似地<code>totalOfTwo</code>将被称为<code>total_of_two</code>或<code>pair_sum</code></li>
<li>但是不需要为<code>totalOfTwo</code>,<code>pairsList</code>声明临时变量,直接使用表达式即可</li>
<li>如果您来自Java,建议您学习正确的Python术语<code>pairsList</code>不是列表,而是元组<code>array</code>不是数组,而是列表。但我只能称之为<code>a</code></李>
<li>注意,我们只需要运行左索引<code>i</code>到len(a)-1而不是len(a),因为我们知道需要j来索引其右侧的元素</李>
</ul>