with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的「清理」操作,釋放資源,比如檔案使用後自動關閉/執行緒中鎖的自動獲取和釋放等。
如下**:
file = open("/users/zhangsf/data/other.txt")
data = file.read()
print(data)
file.close()
try:
f = open("/users/zhangsf/data/other.txt")
data = f.read()
print(data)
except:
print('fail to open')
exit(-1)
finally:
print("finally")
f.close()
雖然這段**執行良好,但比較冗長。
而使用with的話,能夠減少冗長,還能自動處理上下文環境產生的異常。如下面**:
with open("/users/zhangsf/data/other.txt") as file:
data = file.read()
print(data)
(1)緊跟with後面的語句被求值後,返回物件的「–enter–()」方法被呼叫,這個方法的返回值將被賦值給as後面的變數;
(2)當with後面的**塊全部被執行完之後,將呼叫前面返回物件的「–exit–()」方法。
with工作原理**示例:
class sample:
def __enter__(self):
print "in __enter__"
return "foo"
def __exit__(self, exc_type, exc_val, exc_tb):
print "in __exit__"
def get_sample():
return sample()
with get_sample() as sample:
print "sample: ", sample
**的執行結果如下:
in __enter__
sample: foo
in __exit__
可以看到,整個執行過程如下:
(1)enter()方法被執行;
(2)enter()方法的返回值,在這個例子中是」foo」,賦值給變數sample;
(3)執行**塊,列印sample變數的值為」foo」;
(4)exit()方法被呼叫;
【注:】exit()方法中有3個引數, exc_type, exc_val, exc_tb,這些引數在異常處理中相當有用。
exc_type: 錯誤的型別
exc_val: 錯誤型別對應的值
exc_tb: **中錯誤發生的位置
示例**:
class sample():
def __enter__(self):
print('in enter')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print ("type: ", exc_type)
print ("val: ", exc_val)
print ("tb: ", exc_tb)
def do_something(self):
bar = 1 / 0
return bar + 10
with sample() as sample:
sample.do_something()
程式輸出結果:
traceback (most recent call last):
file "/users/zhangsf/code/python/python_learn/bash/test_with.py", line 57, in sample.do_something()
in enter
file "/users/zhangsf/code/python/python_learn/bash/test_with.py", line 54, in do_something
type: bar = 1 / 0
val: division by zero
zerodivisionerror: division by zero
tb: process finished with exit code 1
實際上,在with後面的**塊丟擲異常時,exit()方法被執行。開發庫時,清理資源,關閉檔案等操作,都可以放在exit()方法中。
總之,with-as表示式極大的簡化了每次寫finally的工作,這對**的優雅性是有極大幫助的。
如果有多項,可以這樣寫:
with open('1.txt') as f1, open('2.txt') as f2:
do something
python中decorator的用法及原理(一)
什麼叫裝飾器,其實也可以叫做包裝器。即對於乙個既有的函式func args 在呼叫它之前和之後,我們希望都做一些事情,把這個函式包裝起來。python中的裝飾器分為兩類 函式裝飾器和類裝飾器。這裡我們先討論函式裝飾器。def decorator1 func def dec args print pr...
Python 中return用法及意義
其實說白了,函式就是個你招來的工人。你給他一些材料,告訴他怎麼用這些材料拼裝,然後他負責把拼裝好的成品交給你。材料就是函式的引數,成品是函式的輸出,而怎麼拼裝就是你寫的函式體 了。比如這段 def worker a,b,c x a b y x c這個工人worker在你的指導下,用a b c三個材料...
python中random函式及用法
1 python中的random函式 random 方法返回隨機生成的乙個實數,它在 0,1 範圍內 import random random.random randint函式,返回指定範圍的乙個隨機整數,包含上下限 random.randint 0,99 返回0 99之間的整數 randrange...