打破两个循环

12

可能是重复问题:
如何在Python中跳出多个循环?

在Python中,是否可以跳出两个for循环?
例如:

for i in range(1,100):  
    for j in range(1,100):  
        break ALL the loops!

请参阅 PEP 3136:http://www.python.org/dev/peps/pep-3136/。 - robert
6个回答

36

不,Python中没有嵌套的break语句。

相反,您可以像这样简化您的函数:

import itertools
for i,j in itertools.product(range(1, 100), repeat=2):
  break

...或将代码放入自己的函数中,然后使用 return

def _helper():
   for i in range(1,100):
       for j in range(1,100):
           return
_helper()

使用try-except语句处理异常:

class BreakAllTheLoops(BaseException): pass
try:
   for i in range(1,100):
       for j in range(1,100):
           raise BreakAllTheLoops()
except BreakAllTheLoops:
    pass

.. 或者使用 for-else-continue:

for i in range(1,100):
    for j in range(1,100):
       break
    else:
       continue
    break

或者使用一个标志变量:

exitFlag = False
for i in range(1,100):
    for j in range(1,100):
        exitFlag = True
        break
    if exitFlag:
        break

还有一个选项是缺失的,就是for/else/continue - Andrew Clark
@F.J 已添加,谢谢。我有点担心重复,但这个问题似乎比旧的更容易阅读。 - phihag

5

PEP 3136中提出了几种解决方案,但是BDFL拒绝了该方案

我拒绝这个方案的原因是需要这种特性的代码非常罕见并且复杂。在大多数情况下,已经存在可以产生清晰代码的解决方案,例如使用'return'。虽然我相信有一些(罕见的)真实情况,其中代码的清晰度将受到重构的影响,从而使其可以使用return,但这被两个问题抵消:

  1. 语言的复杂性会永久增加。这不仅影响所有Python实现,还影响每个源代码分析工具,以及当然所有与该语言相关的文档。

  2. 我预计该功能将被滥用,而不是正确使用,导致代码清晰度净减少(跨所有Python代码编写测量)。懒惰的程序员无处不在,你很快就会发现手头上有许多难以理解的代码。


2

不,你不能指定要中断多少个循环。将你的代码放在一个函数中,并使用 return


2
另一种选择:在内部循环中使用一个“标志”变量,并在使用“break”时将其设置为“True”。然后,将其用于“break”外部循环。

1
for i in range(1,100):
    breaking = false
    for j in range(1,100):
        if foundAReasonToBreak:  
            breaking = true
            break
    if breaking:
        break

1
try:
    for i in range(1,10):
        print i
        for j in range(1,10):
            if j == 5: raise AssertionError
            print j
except AssertionError:  
    pass

print "I'm free"

这可能有点不太雅观,但它似乎能够实现你所要求的功能。

编辑:我看到@phihag在我尝试时发布了类似的内容。


2
不要为与异常最初预期的完全不同的情况使用现有的异常。请创建您自己的异常。 - Marian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接