如何在Python中跳出嵌套循环?

9
这些循环结构有什么区别?
for i in range(0,5):
    print i,'i'
    for x in range(0,4):
        print x,'x'
    break

for i in range(0,5):
    print i,'i'
    for x in range(0,4):
        print x,'x'
        break

break语句的作用范围是什么?

1
请编辑您的问题并使用工具格式化您的代码。 - Soviut
这个回答解决了你的问题吗?如何跳出多重循环? - Josh Correia
6个回答

26
< p >一个break只会跳出它所在的最内层循环。你的第一个例子跳出了外部循环,第二个例子仅从内部循环中跳出。

要跳出多个循环,您需要使用变量来跟踪是否要退出,并在每次父循环发生时检查它。

is_looping = True
for i in range(5): # outer loop
    for x in range(4): # inner loop
        if x == 2:
            is_looping = False
            break # break out of the inner loop

    if not is_looping:
        break # break out of outer loop

21

在Python中,您可以为循环编写一个else语句块,当循环没有被break打断或自然终止时执行。有时候,您可以使用它来从多个循环中退出。

for i in some_range:
    for j in some_other_range:
        if need_break(i, j):
            break
    else:
        continue
    break # break happens in inner loop, break outer loop too.

5

您也可以使用异常来实现,如下所示:

class ForLoopBreak(Exception):
    pass

try:
    for i in range(5):
        for j in range(5):
            print "({}, {})".format(i, j)
            if i == 1 and j == 1:
                # Break out of both for loops for this case
                raise ForLoopBreak()

except ForLoopBreak:
    pass

# Output
(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 0)
(1, 1)

2
你可以使用内置的 StopIteration 异常。 - raratiru
1
感谢@raratiru的建议,处理多层嵌套迭代时非常有用! - Max1234-ITA

1
在第一个代码中,'break'属于外部的'for'。因此内部的'for'循环将被执行而没有任何中断,而外部的'for'只会被执行一次。
在第二个代码中,'break'属于内部的'for'。因此外部的'for'将被执行而没有任何中断,而内部的'for'将在每次迭代中只执行一次。
区别在于缩进。

1
其他答案已经解释了这两个程序之间的区别。如果我需要跳出嵌套循环,我会使用私有函数和return语句。以下是一个Python3的示例:
matrix3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

def find():
  for (x, matrix) in enumerate(matrix3d):
    for (y, row) in enumerate(matrix):
      for (z, item) in enumerate(row):
        if item == 6:
          return (x, y, z)

pos = find()

1
你可以在生成器中隔离嵌套的迭代,这样你的处理过程就成了一个单层循环。
for x,y in ((x,y) for x in range(3) for y in range(2)):
    if condition(x,y):
        break

((x,y) for x in range(3) for y in range(2)) 是一个"生成器表达式",对于简单的情况来说已经足够了,当然也可以用一个带有yield语句的生成器函数来实现。


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