如何从函数内继续循环?

How to continue a loop from within a function?

考虑以下因素

for i in range(100):
    if cond1:
        cleanup()
        continue
    if cond2:
        cleanup()
        continue
    if cond3:
        cleanup()
        continue
    ...

    do_work()

我想知道是否有办法以更简洁的方式编写此构造,这样至少不会有 cleanup(); continue 重复的片段。

这几乎就像我希望清理中的 goto 返回到循环的顶部,或者将 continue 推入清理函数。

有没有办法做这样的事情?


编辑一个更详细的例子:

for i in range(100):
    if a == 1:
        cleanup()
        continue
    b = input()
    if a + b == 2:
        cleanup()
        continue
    c = input()
    if a + b + c:
        cleanup()
        continue
    ...

    do_work()

您会注意到我希望每个条件都停止或继续迭代,而 or 无法做到这一点。即使可以,这也会使阅读代码变得更加简单和线性。

否;您只能直接在循环中控制循环。 cleanup 不能假定它将从循环中调用,因此不允许间接中断和继续。

至少对于显示的代码,您可以将各种 if 语句合并为一个:

for i in range(100):
    if cond1 or cond2 or cond3:
        cleanup()
        continue
    do_work()

否则需要检查cleanup的return值来决定是否继续循环

如果你的条件很简单,就做一个if cond1 or cond2 or cond3:但我猜实际代码比这更复杂。

假设您的条件很复杂 and/or 涉及一些需要进行这些清理的准备工作,您可以将它们包含在单次迭代 for 循环中,当不满足任何条件时中断该循环。这将允许您在 else: 语句

中集中清理()/继续
for i in range(100):
    for preconditions in [1]:
        ...
        if cond1: continue
        ...
        if cond2: continue
        ...
        if cond3: continue            
        break                # final break when no conditions are met
    else:
        cleanup()
        continue

    do_work()

请注意,您可以对自定义异常执行类似的操作,并将条件包含在 try/except 语句中,但这似乎有点矫枉过正,所以我没有将其包含在答案中