目錄
1.函式既」變數」 屬於可變化資料2.高階函式
3.巢狀函式
函式是無關順序的,但是執行呼叫的函式必須在執行**前面示例:變數:
函式:a=[1,2] #a為變數名,[1,2]存放記憶體裡面 ==專業稱之變數體
def test1():
.....
#test1==該函式的名字(如變數名a)
#():內的** == [1,2]存放在記憶體裡面 ==專業稱之函式體
#注意2:變數體(函式體)必須最少擁有乙個變數名(函式名),否則記憶體**
a:把乙個函式名當做實參傳給另外乙個函式的函式:通過實驗得到:在不修改被裝飾函式源**的情況下為其新增了功能
b:返回值中包含函式名
通過實驗得到:不修改函式的呼叫方式和源**也可以新增功能
示例:
import time
def bar():
time.sleep(3)
print('in the bar')
def test2(func):
print(func)
return func
test2(bar)()
#bar獲取的是函式bar函式的記憶體位址
#bar()才是執行該函式
高階函式+巢狀函式=裝飾器示例:
詳解:import time
def timmer(func):
def warpper(*args,**kwargs):
start_time = time.time()#開始時間
func()#呼叫開始時間(該裝飾我還不清楚,目前這樣解釋)
stop_time = time.time()#結束時間
print('the func run time is %s' %(stop_time-start_time))#列印顯示***開始時間-
return warpper
def test():
time.sleep(3)#間隔3秒,也就是被呼叫了執行到該步驟的時候停3秒,繼續往下操作
print('in the test')
a=timmer(test) # a == warpper
a() # a()==warpper()
#timmer(test)() == warpper()等於上面兩條命令
timmer(test1)
得到的是
warpper
的該函式記憶體位址
timmer(func) func=test
該函式體
賦值a a() ==warpper()
全域性變數和區域性變數規則,意味著
warpper()
可以呼叫
timmer
函式的形參
func
最終執行了
func() == test()
timmer函式符合高階函式,和巢狀函式,所以是裝飾器
經過python
優化以後裝飾器呼叫變成如下:
@timmer
裝飾到指定的函式如
def test1()
上面:
#帶裝飾器和正常寫法的轉換:import time
def timmer(func):
def warpper(*args,**kwargs):
start_time = time.time()#開始時間
func()#呼叫開始時間(該裝飾我還不清楚,目前這樣解釋)
stop_time = time.time()#結束時間
print('the func run time is %s' %(stop_time-start_time))#列印顯示***開始時間-
return warpper
@timmer#呼叫裝飾器,在需要裝飾的函式的上方
def test():
time.sleep(3)#間隔3秒,也就是被呼叫了執行到該步驟的時候停3秒,繼續往下操作
print('in the test')
test()
#func = test
#test = timmer(test) == warpper
#test()=timmer(test)() == warpper()
test該函式有形參怎麼辦?
1.我們知道
func = test
2.timmer(test1)
得到的是
warpper
的該函式記憶體位址賦值到
test
3.test() == warpper()
4. warpper
函式增加引數組(元祖和字典)
5. test(1,2) == warpper(1,2) warpper
函式執行
func
的時候在把形參給
func就ok
了fun(1,2)
示例:
#帶裝飾器和正常寫法的轉換:import time
def timmer(func):
def warpper(*args,**kwargs):
start_time = time.time()#開始時間
func(args[0], args[1])#呼叫開始時間(該裝飾我還不清楚,目前這樣解釋)
stop_time = time.time()#結束時間
print('the func run time is %s' %(stop_time-start_time))#列印顯示***開始時間-
return warpper
@timmer#呼叫裝飾器,在需要裝飾的函式的上方
def test(a,b):
time.sleep(3)#間隔3秒,也就是被呼叫了執行到該步驟的時候停3秒,繼續往下操作
print('in the test')
test(1,2)
#func = test
#test = timmer(test) == warpper
#test1(1,2)=timmer(test)(1,2) == warpper(1,2)
#func(args[0], args[1]) == test(1,2)
test該函式有return怎麼辦?
示例:
高階裝飾器(其實都是一樣)import time
def timmer(func):
def warpper(*args,**kwargs):
start_time = time.time()#開始時間
res = func(args[0], args[1])#呼叫開始時間(該裝飾我還不清楚,目前這樣解釋)
stop_time = time.time()#結束時間
print('the func run time is %s' %(stop_time-start_time))#列印顯示***開始時間-
return res
return warpper
@timmer#呼叫裝飾器,在需要裝飾的函式的上方
def test(a,b):
time.sleep(3)#間隔3秒,也就是被呼叫了執行到該步驟的時候停3秒,繼續往下操作
return 1
res = test(1,2)
Python裝飾器實戰
結論 一般的裝飾器在裝飾api函式時登入驗證在上 鑑權在下,意即,先登入 再 鑑權 寫在前面閉包 閉包範例def out func variable this is out variable definner print variable func return inner 函式裝飾器import ...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...