引言:
with語句生於python2.5,通過 from __future__ import with_statement 匯入後使用;2.6以後無需匯入直接使用;
with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的「清理」操作,釋放資源;
用途:
最常用的兩個地方,檔案使用後自動關閉、執行緒中鎖的自動獲取和釋放;
可以取代try/finally操作,優化**量;
用例:
1、python with用於檔案使用後自動關閉:
with open(r'e:\majingwei\myprojects\mypython\current\txtfile.txt', 'rb') as file:
for line in file:
print(line)
#try/finally實現
file1 = open(r'e:\majingwei\myprojects\mypython\current\txtfile2.txt', 'rb')
try :
for line in file1:
print(line)
finally:
file1.close()
2、python with用於執行緒鎖的自動獲取和釋放:
'''
執行緒鎖:強制使某段**單執行緒執行,用於防止多個執行緒修改同乙個資料導致混亂;
說明:不上鎖下面例子的num並不確定,上鎖後num列印只能是0;
'''import threading
#建立鎖物件
lock = threading.lock()
#多個執行緒共享的資料
num = 0
def run(n):
global num
for i in range(10000000):
lock.acquire()
try:
num = num + n
num = num - n
finally:
#修改完一定要釋放鎖
lock.release()
'''#與上面**功能相同,with lock可以自動上鎖與解鎖
with lock:
num = num + n
num = num - n
if __name__ == "__main__":
t1 = threading.thread(target=run, args=(2,))
t2 = threading.thread(target=run, args=(3,))
t1.start()
t2.start()
t1.join()
t2.join()
print("num =",num)
報錯:
有可能遇到的錯誤:
1、try finall操作檔案沒有關閉檔案會報的錯:
syntaxerror: unexpected eof while parsing
語法:
with context_expression [as target(s)]:
with-body
with 上下文管理器物件 【as 上下文管理器的__enter__()方法的返回值】:
with語句**塊
context_expression 要返回乙個上下文管理器物件,即with 上下文管理器物件 ;
如果指定了 as 子句的話,會將上下文管理器的 __enter__() 方法的返回值賦值給 target(s)。target(s) 可以是單個變數,或者 由「()」括起來的元組
(不能是僅僅由「,」分隔的變數列表,必須加「()」)
總結:
相關:
在python中的用法 在Python中使用
這篇文章主要介紹了在 python 中使用 slots 方法的詳細教程 slots 方法是python 的乙個重要內建類方法 基於 python2.x 版本需要的朋友可以參考下 正常情況下,當我們定義了乙個 class 建立了乙個 class 的例項後,我們可以給該例項 繫結任何屬性和方法,這就是動...
在python中使用中文 在python中,使用
我需要確保在python中使用特定引數呼叫函式。我用magic mock模擬了這個函式。在self.function magicmock self.function subject hello world 有什麼東西存在於 或者self.function.assert called with sub...
在do while語句中使用continue的誤解
先貼一段 int i 0 dowhile i 10 以前我一直以為,continue就是跳轉到do開始的位置,所以就認為上面這段程式將會是乙個死迴圈。其實卻不然,continue會跳到 處,並不會跳過do while的條件判斷。下面是摘自cppreference上對continue的定義舉例 do ...