Python with語句和過程抽取思想

2022-09-27 05:33:10 字數 2906 閱讀 4477

python中的with語句使用於對資源進行訪問的場合,保證不管處理過程中是否發生錯誤或者異常都會執行規定的__exit__(「清理」)操作,釋放被訪問的資源,比如有檔案讀寫後自動關閉、執行緒中鎖的自動獲取和釋放等。

與python中with語句有關的概念有:上下文管理協議、上下文管理器、執行時上下文、上下文表示式、處理資源的**段。

with語句的應用場景

程式設計中有很jvmoniqs多操作都是配套使用的,這種配套的流程可以稱為計算過程,python語言為這種計算過程專門設計了一種結構:with語句。比如檔案處理就是這類計算過程的典型代表。

使用with語句前後對比

沒有使用with語句之前,我們是這樣開啟乙個檔案的:

try:

# 1. [進入]

f = open('a.txt', 'www.cppcns.comr', encoding="utf-8")

# 2. [執行]

print(f.read())

finally:

if f:

# 3. [退出]

f.close()

python操作檔案的流程一般就是這三步:

1.[進入]用唯讀方式開啟檔案

如果檔案不存在,open()函式就會丟擲乙個ioerror的錯誤,並且給出錯誤碼和詳細的資訊告訴你檔案不存在

2.[執行]讀取檔案內容

如果檔案開啟成功,接下來,呼叫read()方法可以一次讀取檔案的全部內容,python把內容讀到記憶體,用乙個str物件表示

3.[退出]關閉開啟的檔案

檔案使用完畢後必須關閉,因為檔案物件會占用作業系統的資源,並且作業系統同一時間能開啟的檔案數量也是有限的

思考為什麼關閉檔案操作一定要放在finallly語句裡?

由於檔案讀寫時都有可能產生ioerror,一旦出錯,後面的f.close()就不會呼叫。所以,為了保證無論是否出錯都能正確地關閉檔案,我們可以使用try ... finally來實現。

發現共性:

我們發現其實這種過程化的語句有共性,比如說在進去乙個片段前必須做某種超讚,處理工作後又需要執行乙個結束操作。比如上面的這段**:

finally:

if f:

f.close()

就可以做乙個封裝。

使用with語句後,我們是這樣開啟乙個檔案的:

with open("a.txt", "r", encoding="utf-8") as f:

print(f.www.cppcns.comread())

這個with語句和前面的try ... finally結構是一樣的,但是**更佳簡潔,並且不必呼叫f.close()方法。

with語句的執行原理

從直譯器的角度去理解with語句執行流程。

with語句的基本形式是:

with 表示式 as 變數:

語句塊這樣的一段**可以稱為乙個上下文(context),在執行with語句時,直譯器會先求出表示式的值,這個值(物件)是乙個上下文管理器,並且假設這個物件擁有如下類的構造方法:

def __enter__():

# 描述進入上下文的動作

pass

def __exit__():

# 描述退出上下文的動作

pass

with語句在求出這個上下文管理器物件之後,自動執行進入方法,並將這個物件的返回值賦jvmoniqs值於 as 之後的變數,然後執行語句塊。然後在退出上下文前,自動執行物件的退出方法。

python系統和標準庫的一些型別定義了這對操作,可以直接用於with語句。比如檔案物件就直接支援這一對操作,因此可以用在with語句的頭部。

如果你也有類似的計算過程需要抽取出來,那麼可以自定義乙個類,並且包含進入、退出方法。

自定義open函式

自己實現才發現,使用裝飾器和生成器就能很好的解決這個問題,不需要用到類構造方法來實現;

import contextlib # 引入上下文管理包

@contextlib.contextmanager # 給函式引入裝飾器

def myopen(dir, mode):

print("開始")

f = open(dir, mode, encoding='utf-8')

try: # 上文

yield f

finally: # 下文

print("結束")

f.close()

with myopen("a.txt", 'r') as fobj: # 把try中的yield中的f賦值給fobj

# with會將with後面的函式中的yield賦值給fobj

for i inwww.cppcns.com fobj:

print(i)

# 等待上面的迴圈結束後,才最終執行finally的**,所以這就是上下文管理

輸出:開始

hello,我是a.txt的第1行文字。

結束總結

開啟檔案讀寫、用pickle包完成資料的儲存、恢復的操作,都非常適合使用with語句。

pickle包的使用案例:

try:

with open("phone.pickle", "wb") as outf:

pickle.dump("13193388105", outf)

except:

print("file h**e errow.")

try:

with open("phone.pickle", "rb") as outf:

data = pickle.load(outf)

print(type(data))

print(data)

except:

print("file h**e errow.")

我總結了一下使用with語句的優點:

總結本文標題: python with語句和過程抽取思想

本文位址:

python with 語句研究

import sys class test def enter self print enter return 1 def exit self,args print exit return true with test as t print t is not the result of test i...

Python with語句定義及使用

方法 1 首先介紹下with 工作原理 緊跟with後面的語句被求值後,返回物件的 enter 方法被呼叫,這個方法的返回值將被賦值給as後面的變數 當with後面的 塊全部被執行完之後,將呼叫前面返回物件的 exit 方法。with工作原理 示例 class sample def enter se...

Python with語句和上下文管理器物件

今天看書,書上面提到要盡量使用with自動關閉資源,裡面還提到了上下文管理器物件的概念,然後查詢資料,對with的解釋如下 with的有一些任務,可能事先需要設定,事後做清理工作。對於這種場景,python的with語句提供了一種非常方便的處理方式。乙個很好的例子是檔案處理,需要獲取乙個檔案控制代碼...