1.30 break /continue å’Œ 上下文管ç†å™¨å“ªä¸ªä¼˜å…ˆçº§é«˜ï¼Ÿ ================================================== |image0| 众所周知,在循环体ä¸ï¼ˆæ— 论是 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 循环也是åŒæ ·çš„。 |image1| .. |image0| image:: http://image.iswbm.com/20200804124133.png .. |image1| image:: http://image.iswbm.com/20200607174235.png