<p>因为<code>range()</code>序列是<em>固定的</em>,所以不需要使用嵌套的<code>for</code>循环。相反,在<a href="https://docs.python.org/3/library/itertools.html#itertools.product" rel="nofollow noreferrer">^{<cd3>}</a>上使用单个循环:</p>
<pre><code>from itertools import product
for ai, bi, ci in product(range(1, 100), repeat=3):
if ai + bi + ci == 25 and ai * ai == ci:
break
</code></pre>
<p>接下来,删除其中一个重复并降低范围值;您可以从<code>ai</code>和<code>bi</code>简单地计算^{</em><code>ci</code>,范围超过23是没有意义的(因为<code>ci</code>只有在<code>ai + bi</code>小于等于24时才是1或更大):</p>
<pre><code>for ai, bi in product(range(1, 23), repeat=2):
ci = 25 - ai - bi
if ai * ai == ci:
break
</code></pre>
<p>在这里<code>ci</code>可以是负数并不重要,因为<code>ai * ai</code>总是一个正数。你知道吗</p>
<p>请注意,上述方程有四个解,因此从第一个解出发可能不是正确答案。可以使用以下公式计算给定目标值的所有可能解:</p>
<pre><code>def triplets(target):
return (
(ai, bi, target - ai - bi)
for ai, bi in product(range(1, target - 2), repeat=2)
if ai * ai == target - ai - bi
)
</code></pre>
<p>这将返回一个生成器,因此可以使用<a href="https://docs.python.org/3/library/functions.html#next" rel="nofollow noreferrer">^{<cd11>}</a>一次请求单个解决方案:</p>
<pre><code>gen = triplets(25)
print(next(gen, None))
</code></pre>
<p>如果内部循环序列依赖于父循环的值,并且不能简化循环(如上面的<code>ci = 25 - ai - bi</code>赋值),那么您可能需要使用嵌套循环。您总是可以用捕获的异常来打破这种结构;即使是标准的<code>ValueError</code>也可以这样做,或者创建一个自定义异常:</p>
<pre><code>class Break(Exception):
pass
try:
for ai in <some_sequence>:
for bi in range(<based on ai>):
if <condition>:
raise Break
except Break:
# nested set of loops has exited
</code></pre>
<p>或者将循环嵌套在函数中并使用<code>return</code>:</p>
<pre><code>def nested_loops(<arguments>):
for ai in <some_sequence>:
for bi in range(<based on ai>):
if <condition>:
return ai, bi
</code></pre>