国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入學習Python中的上下文管理器與else塊

2020-01-04 16:49:32
字體:
來源:轉載
供稿:網友

前言

本文主要個大家介紹了關于Pythonpython/84646.html">python/205749.html">上下文管理器與else塊的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

在開始之前,我們先來看看下面這段話:

最終,上下文管理器可能幾乎與子程序(subroutine)本身一樣重要。目前,我們只了解了上下文管理器的皮毛……Basic 語言有with 語句,而且很多語言都有。但是,在各種語言中 with 語句的作用不同,而且做的都是簡單的事,雖然可以避免不斷使用點號查找屬性,但是不會做事前準備和事后清理。不要覺得名字一樣,就意味著作用也一樣。with 語句是非常了不起的特性。

——Raymond Hettinger

雄辯的 Python 布道者

先做這個,再做那個:if語句之外的else塊

這個語言特性不是什么秘密,但卻沒有得到重視:else 子句不僅能在if 語句中使用,還能在 for、while 和 try 語句中使用。for/else、while/else 和 try/else 的語義關系緊密,不過與if/else 差別很大。起初,else 這個單詞的意思阻礙了我對這些特性的理解,但是最終我習慣了。

else 子句的行為如下:

for

  僅當 for 循環(huán)運行完畢時(即 for 循環(huán)沒有被 break 語句中止)才運行 else 塊。

while

  僅當 while 循環(huán)因為條件為假值而退出時(即 while 循環(huán)沒有被break 語句中止)才運行 else 塊。

try

  僅當 try 塊中沒有異常拋出時才運行 else 塊。官方文檔(https://docs.python.org/3/reference/compound_stmts.html)還指出:“else 子句拋出的異常不會由前面的 except 子句處理。”

注意:

  在所有情況下,如果異常或者 return、break 或 continue 語句導致控制權跳到了復合語句的主塊之外,else 子句也會被跳過。

  在這些語句中使用 else 子句通常能讓代碼更易于閱讀,而且能省去一些麻煩,不用設置控制標志或者添加額外的 if 語句。

在循環(huán)中使用 else 子句的方式如下述代碼片段所示:

 for item in my_list:  if item.flavor == 'banana':   break  else:   raise ValueError('No banana flavor found!')

一開始,你可能覺得沒必要在 try/except 塊中使用 else 子句。畢竟,在下述代碼片段中,只有 dangerous_call() 不拋出異常,after_call() 才會執(zhí)行,對吧?

 try:  dangerous_call()  after_call() except OSError:  log('OSError...')

然而,after_call() 不應該放在 try 塊中。為了清晰和準確,try 塊中應該只拋出預期異常的語句。因此,像下面這樣寫更好:

 try:  dangerous_call() except OSError:  log('OSError...') else:  after_call()

現(xiàn)在很明確,try 塊防守的是 dangerous_call() 可能出現(xiàn)的錯誤,而不是 after_call() 。而且很明顯,只有 try 塊不拋出異常,才會執(zhí)行after_call()

上下文管理器和with塊

  上下文管理器對象存在的目的是管理 with 語句,就像迭代器的存在是為了管理 for 語句一樣。

  with 語句的目的是簡化 try/finally 模式。這種模式用于保證一段代碼運行完畢后執(zhí)行某項操作,即便那段代碼由于異常、return 語句或sys.exit() 調用而中止,也會執(zhí)行指定的操作。finally 子句中的代碼通常用于釋放重要的資源,或者還原臨時變更的狀態(tài)。

  上下文管理器協(xié)議包含 __enter__ 和 __exit__ 兩個方法。with 語句開始運行時,會在上下文管理器對象上調用 __enter__ 方法。with 語句運行結束后,會在上下文管理器對象上調用 __exit__ 方法,以此扮演 finally 子句的角色。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 唐山市| 宁明县| 甘肃省| 南充市| 治县。| 时尚| 承德市| 宁化县| 辽宁省| 山东| 榕江县| 长泰县| 郯城县| 昭苏县| 亚东县| 河南省| 本溪| 辉县市| 永德县| 镇赉县| 舞阳县| 电白县| 阳东县| 石门县| 都匀市| 新邵县| 固始县| 大田县| 衡南县| 桦甸市| 罗平县| 墨江| 独山县| 阿巴嘎旗| 密云县| 扶沟县| 广平县| 昌图县| 乐清市| 含山县| 垣曲县|