多个 for 循环中断 Python
Multiple for-loops break in Python
我正在解决 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
但是当最后一次 if find for-loops 的解决方案继续时,我想打破所有这些。
这可行吗?我想过使用一些标志,但它会额外检查每个步骤并使执行时间更长。
因为您的 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
接下来,删除其中一个重复项并降低范围值;您可以根据 ai
和 bi
简单地 计算 ci
,超过 23 的范围是没有意义的(因为 ci
只会是 1 或如果 ai + bi
等于或小于 24,则更大):
for ai, bi in product(range(1, 23), repeat=2):
ci = 25 - ai - bi
if ai * ai == ci:
break
这里 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
)
这 returns 一个生成器,因此可以使用 next()
:
一次请求一个解决方案
gen = triplets(25)
print(next(gen, None))
如果您的内部循环序列依赖于父循环的值,并且您无法简化循环(如上面的 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
或将循环嵌套在函数中并使用 return
:
def nested_loops(<arguments>):
for ai in <some_sequence>:
for bi in range(<based on ai>):
if <condition>:
return ai, bi
你可以
- 将其放入一个函数中,return一旦达到该值
或
- 一旦达到该值就引发异常,并通过:
try:
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:
raise BreakE
except BreakE:
pass
我正在解决 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
但是当最后一次 if find for-loops 的解决方案继续时,我想打破所有这些。 这可行吗?我想过使用一些标志,但它会额外检查每个步骤并使执行时间更长。
因为您的 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
接下来,删除其中一个重复项并降低范围值;您可以根据 ai
和 bi
简单地 计算 ci
,超过 23 的范围是没有意义的(因为 ci
只会是 1 或如果 ai + bi
等于或小于 24,则更大):
for ai, bi in product(range(1, 23), repeat=2):
ci = 25 - ai - bi
if ai * ai == ci:
break
这里 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
)
这 returns 一个生成器,因此可以使用 next()
:
gen = triplets(25)
print(next(gen, None))
如果您的内部循环序列依赖于父循环的值,并且您无法简化循环(如上面的 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
或将循环嵌套在函数中并使用 return
:
def nested_loops(<arguments>):
for ai in <some_sequence>:
for bi in range(<based on ai>):
if <condition>:
return ai, bi
你可以
- 将其放入一个函数中,return一旦达到该值
或
- 一旦达到该值就引发异常,并通过:
try:
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:
raise BreakE
except BreakE:
pass