這篇文章主要介紹了關於python中關鍵字"with"和上下文管理器的相關資料,文中介紹的非常詳細,相信對大家學習或使用python具有一定的參考價值,需要的朋友們下面來一起看看吧。
前言
如果你有閱讀原始碼的習慣,可能會看到一些優秀的程式碼經常出現有「with」關鍵字的語句,它通常用在什麼場景?今天就來談談 with 和 上下文管理器。
對於系統資源如檔案、資料庫連線、socket 而言,應用程式開啟這些資源並執行完業務邏輯之後,必須做的一件事就是要關閉(已中斷)該資源。
例如 Python 程式開啟一個文件,往文件中寫內容,寫完之後,就要關閉該文件,否則會出現什麼情況呢?極端情況下會出現 "Too many open files" 的錯誤,因為系統允許你開啟的最大檔案數量是有限的。
同樣,對於資料庫,如果連接數過多而沒有及時關閉的話,就可能會出現"Can not connect to MySQL server Too many connections",因為資料庫連接是一種非常昂貴的資源,不可能無限制的被創建。
來看看如何正確關閉一個檔案。
普通版:
def m1(): f = open("output.txt", "w") f.write("python之禅") f.close()
這樣寫有一個潛在的問題,如果在呼叫write 的過程中,出現了異常進而導致後續程式碼無法繼續執行,close 方法無法被正常調用,因此資源就會一直被該程式佔用者釋放。那麼該如何改進程式碼呢?
進階版:
def m2(): f = open("output.txt", "w") try: f.write("python之禅") except IOError: print("oops error") finally: f.close()
改良版本的程式是對可能發生例外的程式碼處進行try 捕獲,使用try/finally 語句,該語句表示如果在try 程式碼區塊中程式出現了異常,後續程式碼就不再執行,而直接跳到except 程式碼區塊。而無論如何,finally 區塊的程式碼最終都會被執行。因此,只要把 close 放在 finally 程式碼中,檔案就一定會關閉。
進階版:
def m3(): with open("output.txt", "w") as f: f.write("Python之禅")
一種更簡潔、優雅的方式就是用 with 關鍵字。 open 方法的回傳值賦值給變數 f,當離開 with 程式碼區塊的時候,系統會自動呼叫 f.close()
方法, with 的作用和使用 try/finally 語句是一樣的。那麼它的實作原理是什麼呢?
在講 with 的原理前要涉及到另一個概念,就是上下文管理器(Context Manager)。
上下文管理器
任何實作了__enter__()
和__exit__()
方法的物件都可稱為上下文管理器,上下文管理器物件可以使用with 關鍵字。顯然,檔案(file)物件也實作了上下文管理器。
那麼文件物件是如何實現這兩個方法的呢?我們可以模擬實作一個自己的檔案類,讓該類別實作 __enter__()
和 __exit__()
方法。
class File(): def __init__(self, filename, mode): self.filename = filename self.mode = mode def __enter__(self): print("entering") self.f = open(self.filename, self.mode) return self.f def __exit__(self, *args): print("will exit") self.f.close()
__enter__()
方法返回資源對象,這裡就是你將要開啟的那個文件對象, __exit__()
方法處理一些清除工作。
因為 File 類別實作了上下文管理器,現在就可以使用 with 語句了。
with File('out.txt', 'w') as f: print("writing") f.write('hello, python')
這樣,你就不需要顯示地調用 close 方法了,由系統自動去調用,即使中間遇到異常 close 方法也會被調用。
contextlib
Python 也提供了一個 contextmanager 的裝飾器,更進一步簡化了上下文管理器的實作方式。透過 yield 將函數分割成兩部分,yield 之前的語句在 __enter__
方法中執行,yield 之後的語句在 __exit__
方法中執行。緊接在 yield 後面的值是函數的回傳值。
from contextlib import contextmanager @contextmanager def my_open(path, mode): f = open(path, mode) yield f f.close()
呼叫
with my_open('out.txt', 'w') as f: f.write("hello , the simplest context manager")
總結
#以上是詳細講解python中的關鍵字「with」與上下文管理器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python的靈活性體現在多範式支持和動態類型系統,易用性則源於語法簡潔和豐富的標準庫。 1.靈活性:支持面向對象、函數式和過程式編程,動態類型系統提高開發效率。 2.易用性:語法接近自然語言,標準庫涵蓋廣泛功能,簡化開發過程。

Python因其簡潔與強大而備受青睞,適用於從初學者到高級開發者的各種需求。其多功能性體現在:1)易學易用,語法簡單;2)豐富的庫和框架,如NumPy、Pandas等;3)跨平台支持,可在多種操作系統上運行;4)適合腳本和自動化任務,提升工作效率。

可以,在每天花費兩個小時的時間內學會Python。 1.制定合理的學習計劃,2.選擇合適的學習資源,3.通過實踐鞏固所學知識,這些步驟能幫助你在短時間內掌握Python。

Python適合快速開發和數據處理,而C 適合高性能和底層控制。 1)Python易用,語法簡潔,適用於數據科學和Web開發。 2)C 性能高,控制精確,常用於遊戲和系統編程。

學習Python所需時間因人而異,主要受之前的編程經驗、學習動機、學習資源和方法及學習節奏的影響。設定現實的學習目標並通過實踐項目學習效果最佳。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器