每当你需要跳出嵌套循环时,通常很难思考细节,当你想明白后,答案通常只是它是不可能的(或者至少只能通过显式标志变量、异常或其他模糊你的逻辑来实现)。
对此有一个简单的答案(我将在下面包含它,以防任何人通过搜索找到这个问题),但这实际上不是你的问题。你想要检查的不是“我是否正常完成了循环”,因为你总是正常完成循环。你想要检查的是“我是否做了一些事情(在这种情况下,调用doSomething函数)一次或多次”。
与跳出外部循环不同,这不是关于外部循环的,所以没有语法。你需要跟踪你是否做了一次或多次某事,你已经在做的方式可能是最简单的方式。
在某些情况下,您可以重新排列事物以展开或反转循环,以便您一次处理所有当前的值并退出该循环,此时它就是关于再循环的。但如果这使你的逻辑变得混乱,以至于不再清楚正在发生什么,那么这不会是一个改进。例如:
fits = set()
for key in keys:
for obj in objects:
if <obj fits to key>:
fits.add((obj, key))
for obj, key in fits:
do_something(obj, key)
if not fits:
do_something_else()
这可以简化:
fits = {(obj, key) for key in keys for obj in objects if <obj fits to key>}
for obj, key in fits:
do_something(obj, key)
if not fits:
do_something_else()
无论如何,注意我避免存储一个标记来表示是否找到匹配的方式是存储所有找到的匹配集合。对于某些问题,这是一种改进。但如果该集合非常大,那么这是一个可怕的想法。如果该集合在概念上与您的问题没有任何意义,它可能会使逻辑变得复杂而不是简化。
如果你的问题是要跳出嵌套循环(虽然它并不是这样,但是如果有人通过搜索找到了这个问题,可能会这样),那么总有一个简单的答案:将整个嵌套循环重构为一个函数。然后你可以通过使用return
在任何级别中跳出。如果你没有return
,循环后面的代码将被执行,而如果你使用了return
,它就像一个else
一样。
所以:
def fits():
for key in keys:
for obj in objects:
if <obj fits to key>:
doSomething(obj, key)
return
doSomethingDifferent()
fits()
我不确定你是否希望同时中断这两个循环,如果是的话,这段代码确切地实现了你的需求。如果不是,那么我不知道你在使用else
时想要的语义是什么,因此我不知道如何解释如何实现。
完成后,您可能会发现该抽象适用于代码中的更多用途,因此您可以将该函数转换为接受参数而非使用闭包或全局变量,并返回一个值或引发异常而非调用两个函数等。但有时,这个简单的本地函数就足够了。
break
同时跳出外层循环和内层循环吗?如果是,那是不可能的(除非用一个标志以及两个break
),这才是真正的问题;如果你确实有一种方法可以跳出外层循环,那么将会跳过外部的else
。另一方面,如果你不想要那样做,那么else
就没有意义了——你永远不会跳出外层循环——因此,这说明你的设计有问题,而不是语言的限制。 - abarnert