python中with的神奇用法

2021-09-24 21:01:46 字數 1542 閱讀 6693

在實際的編碼過程中,有時有一些任務,需要事先做一些設定,事後做一些清理,這時就需要python with出場了,with能夠對這樣的需求進行乙個比較優雅的處理,最常用的例子就是對訪問檔案的處理。

一般訪問檔案資源時我們會這樣處理:

f = open(r'c:\test.txt', 'r')

data = f.read()

f.close()

這樣寫沒有錯,但是容易犯兩個毛病:

如果在讀寫時出現異常而忘了異常處理。

忘了關閉檔案控制代碼

以下的加強版本的寫法:

f = open(r'c:\test.txt', 'r')

try:

data = f.read()

finally:

f.close()

以上的寫法就可以避免因讀取檔案時異常的發生而沒有關閉問題的處理了。**長了一些。

但使用with有更優雅的寫法:

with open(r'c:\test.txt', 'r') as f:

data = f.read()

with後面接的物件返回的結果賦值給f。此例當中open函式返回的檔案物件賦值給了f.with會自已獲取上下檔案的異常資訊。

with是如何做到的呢?

with後面返回的物件要求必須兩__enter__()/exit()這兩個方法,而檔案物件f剛好是有這兩個方法的,故應用自如。

在併發變成,處理多執行緒鎖的場景是,也可以用with來做比如

def sub2():

global count, lock

if lock.acquire(1):

# acquire()是獲取鎖,acquire(1)返回獲取鎖的結果,成功獲取到互斥鎖為true,如果沒有獲取到互斥鎖則返回false

tmp = count

time.sleep(0.001)

count = tmp + 1

time.sleep(0.1)

lock.release() # 一系列操作結束之後需要釋放鎖

def sub3():

global count, lock

with lock:

tmp = count

time.sleep(0.001)

count = tmp + 1

def verity(fun):

global count

thread_list =

for i in range(100):

t = td.thread(target=fun, args=())

t.start()

for j in thread_list:

j.join()

print(count)

if __name__ == '__main__':

count = 0

lock = td.lock()

verity(sub3)

python中神奇的集合

從上節學習過字串後,心中就在思考,想要儲存多個字串怎麼辦?c中有陣列可以實現上述功能,那python呢?現在就讓我們來一 竟吧。python中提供了一種神奇的資料型別list,他有多神奇呢,大家先不要急,讓我婉婉到來,茶要慢慢品嘛。list是一種有序的集合,可以隨時對他進行增減等操作。比如需要列出小...

python中神奇的格式化輸出

python一共有兩種格式化輸出語法,一種是類似於c語言printf的方式,稱為 formatting expression s d d hello 7,1 hello 7 1 另一種是類似於c 的方式,稱為string formatting method calls format hello 1 ...

python神奇的動態引數

python 列印出來的內容是 1,2,3 boy doc init module name pros python不定引數 引數以乙個 號開頭的代表著乙個任意長度的陣列,可以接收連續一串引數,如上面 裡傳的是1,2,3,你可以更多。引數以兩個 號開頭的代表著乙個字典,引數的形式是 key valu...