Python中有多个for循环中断

1 python for-loop break

我正在解决Euler的项目,现在Triyn解决了9个任务。

我发现的解决方案是在3个嵌套循环中:

for ai in range(1, 100):
   for bi in range(1, 100):
      for ci in range(1,100):
          if ai + bi + ci == 25 and ai * ai = ci:
             break
Run Code Online (Sandbox Code Playgroud)

但是最后一次找到解决方案时,for循环仍在继续,我想破坏所有这些循环。 有可能吗?我想使用一些标志,但这是每个步骤的额外检查,并会使执行时间更长。

Mar*_*ers 6

由于range()序列是固定的,因此不需要使用嵌套for循环。相反,请使用一个循环itertools.product()

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
Run Code Online (Sandbox Code Playgroud)

接下来,删除重复项之一并降低范围值;您可以通过和轻松地计算 ,超过23的范围是毫无意义的(如果等于或小于24 ,则只能为1或更大):ciaibiciai + bi

for ai, bi in product(range(1, 23), repeat=2):
    ci = 25 - ai - bi
    if ai * ai == ci:
         break
Run Code Online (Sandbox Code Playgroud)

ci在这里可以为负也没有关系,因为ai * ai永远是正数。

请注意,上述方程式有四个解,因此第一个解可能不是正确的答案。您可以使用以下方法计算给定目标值的所有可能解:

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
    )
Run Code Online (Sandbox Code Playgroud)

这将返回一个生成器,因此可以使用一次要求一个解决方案next()

gen = triplets(25)
print(next(gen, None))
Run Code Online (Sandbox Code Playgroud)

如果您的内部循环序列取决于父循环的值,并且您无法简化循环(如上述ci = 25 - ai - bi分配),则可能需要使用嵌套循环。您总是可以突破此类结构,但会遇到异常。甚至标准ValueError也可以,或者创​​建自定义异常:

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
Run Code Online (Sandbox Code Playgroud)

或将循环嵌套在函数中并使用return

def nested_loops(<arguments>):
    for ai in <some_sequence>:
        for bi in range(<based on ai>):
            if <condition>:
                return ai, bi
Run Code Online (Sandbox Code Playgroud)