第15章 上下文管理器和 else 塊

2021-10-24 03:14:23 字數 1158 閱讀 1155

這個語言特性不是什麼秘密,但卻沒有得到重視:else 子句不僅能在 if 語句中使用,還能在 for、while 和 try 語句中使用。

else 子句的行為如下:

在 for 中 :僅當 for 迴圈執行完畢時(即 for 迴圈沒有被 break 語句中止) 才執行 else 塊。

在 while 中:僅當 while 迴圈因為條件為假值而退出時(即 while 迴圈沒有被 break 語句中止)才執行 else 塊。

在 try 中:僅當 try 塊中沒有異常丟擲時才執行 else 塊。

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

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

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

# ⚠️ 執行 with 後面的表示式得到的結果是上下文管理器物件,

# 不過,把值繫結到目標變數 fp 上(as 子句)是在上下文管理器物件上呼叫 __enter__ 方法的結果。

# 1. 先執行表示式 open,開啟檔案物件,with 呼叫檔案物件的 __enter__ 方法,然後將變數名 fp 繫結到 open 開啟的檔案物件上。

with open('mirror.py') as fp:

src = fp.read(60) # 從 fp 中獲取資料

# 2. 離開 with **塊,呼叫檔案物件的 __exit__ 方法

len(src) # 60

# fp 變數仍可以使用

# 可以讀取 fp 物件的屬性

print(fp.closed, fp.encoding) # (true, 'utf-8')

fp.read(60)

# traceback (most recent call last):

# file "", line 1, in valueerror: i/o operation on closed file.

with上下文管理器

在執行 with 語句時,首先執行 with 後面的 open 執行完 後,會將 的結果通過 as 儲存到 f 中 然後在下面實現真正要執行的操作 在操作後面,並不需要寫檔案的關閉操作,檔案會在使用完後自動關閉 實際上,在檔案操作時,並不是不需要寫檔案的關閉,而是檔案的關閉操作在 with 的上下文...

with上下文管理器

上下文管理器 任何實現了enter 和exit 法的物件都可稱之為上下 管理 器,上下 管理器物件可以使 with 關鍵字。顯然,件 file 物件也實現 了上下 管理器 方法一class file def init self,filename,mode self.filename filename...

上下文管理器

今天我們聊聊上下文管理器,當然今天所談僅為個人觀點!今天如果不是學生面試回來跟我聊到了上下文管理器,我都忘了python中還有這麼個鬼了。特別寫一篇博文我們簡單聊聊。普通的檔案操作方式,例如 情況01 1 以寫的方式開啟檔案 f open 1.txt w 2 寫入檔案內容 f.write hello...