如何跳出多个循环?

735 投票
40 回答
758529 浏览
提问于 2025-04-11 09:24

给定以下这段代码(它不能正常工作):

while True:
    # Snip: print out current state
    while True:
        ok = get_input("Is this ok? (y/n)")
        if ok.lower() == "y": break 2 # This doesn't work :(
        if ok.lower() == "n": break

    # Do more processing with menus and stuff

有没有办法让它正常运行?还是说我需要先在输入循环中做一个检查来退出,然后再在外层循环中做另一个更有限的检查,以便如果用户满意就完全退出?

40 个回答

185

PEP 3136 提出了带标签的跳出和继续功能。Guido 拒绝了这个提议,因为他说“需要这种功能的复杂代码非常少见”。不过,这个提议确实提到了一些替代方法,比如使用异常处理的技巧,而Guido认为在大多数情况下,重构代码使用返回值会更简单。

503

这里有另一种简短的方法。缺点是你只能跳出外层循环,但有时候这正是你想要的效果。

for a in xrange(10):
    for b in xrange(20):
        if something(a, b):
            # Break the inner loop...
            break
    else:
        # Continue if the inner loop wasn't broken.
        continue
    # Inner loop was broken, break the outer.
    break

这个方法使用了 for / else 结构,具体解释可以参考这里:为什么 Python 在 for 和 while 循环后面使用 'else'?

关键点:看起来外层循环总是会被打断,但如果内层循环没有被打断,外层循环也不会被打断。

这里的魔法在于 continue 语句。它出现在 for-else 结构中。根据定义,如果内层没有打断,这种情况就会发生。在这种情况下,continue 可以巧妙地绕过外层的打断。

737

我第一反应是把这个嵌套的循环整理成一个函数,然后用 return 来退出这个函数。

撰写回答