我想知道是否有任何内置方法可以继续在 python 的外循环中进行下一次迭代。例如,考虑以下代码:
for ii in range(200): for jj in range(200, 400): ...block0... if something: continue ...block1...
我希望这个 continue 语句退出 jj 循环并转到 ii 循环中的下一项。我可以通过其他方式实现这个逻辑(通过设置标志变量),但是有没有简单的方法可以做到这一点,或者这就像要求太多?
for i in ...: for j in ...: for k in ...: if something: # continue loop i
在一般情况下,当您有多个循环级别并且break不适合您时(因为您想继续上面的循环之一,而不是当前循环正上方的循环),您可以执行以下操作之一
break
def inner(): for j in ...: for k in ...: if something: return for i in ...: inner()
缺点是您可能需要将一些变量传递给该新函数,这些变量以前在范围内。您可以将它们作为参数传递,使它们成为对象上的实例变量(如果有意义,仅为此函数创建一个新对象),或者全局变量,单例,等等(ehm,ehm)。
或者你可以定义inner为一个嵌套函数,让它只捕获它需要的东西(可能会更慢?)
inner
for i in ...: def inner(): for j in ...: for k in ...: if something: return inner()
从哲学上讲,这就是例外的用途,在必要时通过结构化编程构建块(if、for、while)打破程序流程。
优点是您不必将单段代码分成多个部分。如果它是您在用 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
为此创建一个特殊的异常类,这样您就不会冒着意外使其他异常静音的风险。
我相信还有其他解决方案。