问题描述
for i in ...:
for j in ...:
for k in ...:
if something:
# continue loop i
在一般情况下,当您有多个循环级别且break
对您不起作用时(因为您要继续上一个循环,而不是当前循环的右上循环),可以执行以下操作之一
将您想摆脱的循环重构为一个函数
def inner():
for j in ...:
for k in ...:
if something:
return
for i in ...:
inner()
缺点是您可能需要将以前在范围内的一些变量传递给该新函数。您既可以将它们作为参数传递,也可以在对象上使它们成为实例变量(如果有意义,则仅为此函数创建一个新对象),或者全局变量,单例(无论是什么)(ehm,ehm)。
或者,您可以将其定义inner
为嵌套函数,然后使其仅捕获所需的内容(可能会更慢?)
for i in ...:
def inner():
for j in ...:
for k in ...:
if something:
return
inner()
使用例外
从哲学上讲,这就是例外,在必要时,通过结构化的编程构建块(如果是,为时,为时)中断程序流。
这样做的好处是您不必将单个代码分成多个部分。如果这是您在用Python编写代码时正在设计的某种计算,那么这很好。在早期引入抽象可能会使您减速。
这种方法的坏处在于,解释器/编译器作者通常会认为异常是例外情况,因此会相应地对其进行优化。
class ContinueI(Exception):
pass
continue_i = ContinueI()
for i in ...:
try:
for j in ...:
for k in ...:
if something:
raise continue_i
except ContinueI:
continue
为此创建一个特殊的异常类,这样您就不会冒意外使某些其他异常静默的风险。
完全其他的东西
我确信还有其他解决方案。
解决方法
我想知道是否有任何内置方法可以继续进行python外循环中的下一次迭代。例如,考虑以下代码:
for ii in range(200):
for jj in range(200,400):
...block0...
if something:
continue
...block1...
我希望此继续语句退出jj循环并转到ii循环中的下一项。我可以通过其他方式(通过设置标志变量)来实现此逻辑,但是有一种简单的方法可以做到这一点,还是像要求太多?