小编典典

Python:在外循环中继续下一次迭代

all

我想知道是否有任何内置方法可以继续在 python 的外循环中进行下一次迭代。例如,考虑以下代码:

for ii in range(200):
    for jj in range(200, 400):
        ...block0...
        if something:
            continue
    ...block1...

我希望这个 continue 语句退出 jj 循环并转到 ii
循环中的下一项。我可以通过其他方式实现这个逻辑(通过设置标志变量),但是有没有简单的方法可以做到这一点,或者这就像要求太多?


阅读 59

收藏
2022-08-21

共1个答案

小编典典

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()

使用例外

从哲学上讲,这就是例外的用途,在必要时通过结构化编程构建块(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

为此创建一个特殊的异常类,这样您就不会冒着意外使其他异常静音的风险。

完全不同的东西

我相信还有其他解决方案。

2022-08-21