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

我想知道是否有任何内置的方式来继续在Python的外循环下一个迭代。 例如,考虑下面的代码:

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

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

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

缺点是你可能需要传递一些variables,这是以前的范围。 你可以将它们作为parameter passing给对象,在对象上创build实例variables(如果这个函数有意义的话,可以创build一个新的对象),也可以是全局variables,单例,任何东西(ehm,ehm)。

或者你可以将inner定义为一个嵌套函数,让它只捕获它需要的东西(可能会慢些?)

 for i in ...: def inner(): for j in ...: for k in ...: if something: return inner() 

使用例外

在哲学上,这是例外情况,必要时通过结构化编程构build块(如果需要的话)打破程序stream程。

好处是你不必把单个代码分解成多个部分。 这是好的,如果它是一种计算,你正在devise,而在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 

为此创build一个特殊的exception类,以免意外沉默其他exception。

还有其他的东西

我相信还有其他解决scheme。

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

Break将打破内部循环,并且block1将不会被执行(只有当内部循环正常退出时它才会运行)。

在其他语言中,您可以标记循环并从标签循环中断开。 Python增强build议(Python Enhancement Proposal,PEP)3136build议将这些添加到Python,但Guido拒绝了它 :

但是,我拒绝它的代码太复杂,要求这个function是非常罕见的。 在大多数情况下,现有的解决方法可以生成干净的代码,例如使用“返回”。 虽然我确定有一些(罕见的)真实情况,代码的清晰性会因重构而受到影响,使得可能使用返回,但这会被两个问题所抵消:

  1. 永久性地增加了语言的复杂性。 这不仅影响所有的Python实现,还影响到每个源分析工具,当然还有所有语言的文档。

  2. 我期望这个特性会被滥用,而不是被正确地使用,从而导致代码清晰度的净降低(从今后编写的所有Python代码中测量)。 懒惰的程序员到处都是,在你知道它之前,你的手上有难以理解的代码。

所以如果这就是你所希望的,那么你倒霉了,但是看看其他的答案,因为那里有很好的select。

我想你可以做这样的事情:

 for ii in range(200): restart = False for jj in range(200, 400): ...block0... if something: restart = True break if restart: continue ...block1... 

处理这种问题的另一种方法是使用Exception()。

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

例如:

 for n in range(1,4): for m in range(1,4): print n,'-',m 

结果:

  1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3 

假设我们想从m循环跳转到外部的n循环,如果m = 3:

 for n in range(1,4): try: for m in range(1,4): if m == 3: raise Exception() print n,'-',m except Exception: continue 

结果:

  1-1 1-2 2-1 2-2 3-1 3-2 

参考链接: http : //www.programming-idioms.org/idiom/42/continue-outer-loop/1264/python