with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的「清理」操作,釋放資源,比如檔案使用後自動關閉、執行緒中鎖的自動獲取和釋放等。
#一般訪問檔案資源時我們會這樣處理:
f = open(
'c:\test.txt', 'r')
data = f.read()
f.close()
# 這樣寫沒有錯,但是容易犯兩個毛病:
# 1. 如果在讀寫時出現異常而忘了異常處理。
# 2. 忘了關閉檔案控制代碼
#以下的加強版本的寫法:
f = open('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 的實現
class test:
def __enter__(self):
print('__enter__() is call!')
return self
def dosomething(self):
print('dosomethong)
def __exit__(self, exc_type, exc_value, traceback):
print('__exit__() is call!')
print(f'type:')
print(f'value:')
print(f'trace:')
print('__exit()__ is call!')
with test() as sample:
pass
#當物件被例項化時,就會主動呼叫__enter__()方法,任務執行完成後就會呼叫__exit__()方法,
#另外,注意到,__exit__()方法是帶有三個引數的(exc_type, exc_value, traceback),
#依據上面的官方說明:如果上下文執行時沒有異常發生,那麼三個引數都將置為 none,
#這裡三個引數由於沒有發生異常,的確是置為了 none, 與預期一致.
# 修改後不出異常了
class test:
def __enter__(self):
print('__enter__() is call!')
return self
def dosomething(self):
x = 1/0
print('dosomethong!')
def __exit__(self, exc_type, exc_value, traceback):
print('__exit__() is call!')
print(f'type:')
print(f'value:')
print(f'trace:')
print('__exit()__ is call!')
return true
with test() as sample:
break語句的作用
和continue語句一樣,在迴圈語句中與條件語句一起使用。break語句用於跳出本層迴圈體,開始執行本層迴圈體外的 for var i 1 i 10 i 輸出結果 12345 break語句跳出包含它的switch,while,do,for,或foreach語句。假如break不是在switch,...
continue語句的作用
continue語句的作用 通常在迴圈語句與條件語句一起使用。在迴圈中碰到continue後,就會終止本次迴圈,不執行該迴圈中位於continue後面的任何語句。continue語句用於結束當次迴圈,進入下乙個迴圈。for var i 1 i 10 i if i 6 continue documen...
break語句的作用
和continue語句一樣,在迴圈語句中與條件語句一起使用。break語句用於跳出本層迴圈體,開始執行本層迴圈體外的 for var i 1 i 10 i if i 6 break document.write i 輸出結果 12345 break語句跳出包含它的switch,while,do,fo...