1.30 break /continue 和 上下文管理器哪个优先级高? ================================================== .. image:: http://image.iswbm.com/20200804124133.png 众所周知,在循环体中(无论是 for 还是 while),continue 会用来跳入下一个循环,而 break 则用来跳出某个循环体。 同时我们又知道:在上下文管理器中,被包裹的程序主体代码结束会运行上下文管理器中的一段代码(通常是资源的释放)。 但如果把上下文管理器放在一个循环体中,而在这个上下文管理器中执行了 break ,是否会直接跳出循环呢? 换句话说,上下文管理器与 break/continue 这两个规则哪一个优先级会更高一些? 这个问题其实不难,只要做一下试验都能轻易地得出答案,难就难在很多对这个答案都是半猜半疑,无法肯定地回答。 试验代码如下: .. code:: python import time import contextlib @contextlib.contextmanager def runtime(value): time.sleep(1) print("start: a = " + str(value)) yield print("end: a = " + str(value)) a = 0 while True: a+=1 with runtime(a): if a % 2 == 0: break 从输出的结果来看,当 a = 2 时执行了 break ,此时的并不会直接跳出循环,依然要运行上下文管理器里清理释放资源的代码(示例中,我使用 print 来替代)。 :: start: a = 1 end: a = 1 start: a = 2 end: a = 2 另外还有几个与此类似的问题,我这里也直接给出答案,不再细说了 1. continue 与 break 一样,如果先遇到上下文管理器会先进行资源的释放 2. 上面只举例了 while 循环体,而 for 循环也是同样的。