如何从函数内继续循环?
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 语句中,但这似乎有点矫枉过正,所以我没有将其包含在答案中
考虑以下因素
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 语句中,但这似乎有点矫枉过正,所以我没有将其包含在答案中