Python小白学习之函数装饰器
生活随笔
收集整理的這篇文章主要介紹了
Python小白学习之函数装饰器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
裝飾器
2018-10-25 13:49:37
裝飾器從字面意思就是用來裝飾的,在函數可以理解為:在函數中,我們不想影響原來的函數功能,又想給函數添加新的功能,這時候我們就用到了裝飾器。
一般函數操作(不用裝飾器):
1 import time 2 print(time.time()) 3 def i_can_sleep(): 4 time.sleep(3) 5 start = time.time() 6 i_can_sleep() 7 stop = time.time() 8 print("函數運行了%s"%(stop - start))?
執行結果:
?
使用裝飾器:
下面程序分為4步走(外部函數、返回嵌套函數、嵌套函數+語法糖(@裝飾函數簡寫)+被裝飾函數+調用被裝飾的函數);若有大量的調用函數i_can_sleep并查看程序運行了多長時間,我們就嘚不厭其煩的定義新的start和stop變量,然后打印時間 為此,我們就需要更簡單的方法,裝飾器,把這些重復的工作封裝到裝飾函數中也就是封裝到@裝飾函數名(語法糖) 代碼如下:1 ################################### 2 import time 3 def timer(fun):#參數是我們要傳入的被裝飾函數,記下面的i_can_sleep函數 #1 4 #此處我們需要在函數內部再定義一個內部函數,即嵌套函數 5 def decorator(): 6 start = time.time() 7 fun() #調用被裝飾的函數,下面的i_can_sleep() 8 stop = time.time() 9 print('被裝飾的函數i_can_sleep程序執行時間為:',stop-start) #給被裝飾函數添加計時器功能 10 return decorator 11 @timer #裝飾函數 # 2 12 def i_can_sleep():#我們要裝飾的函數,即被裝飾函數 # 3 13 time.sleep(3) 14 i_can_sleep() #最后一步調用程序 # 4 15 # 其實上面的第四部也可以按下面寫,只是裝飾器簡化下面的步驟。 16 #next = timer(i_can_sleep);next()
執行結果如下:
可以看到執行結果和不使用裝飾器一樣的。看上去使用裝飾器復雜了,實際上,對于大量執行計時器操作,就不用重復定義變量并打印結果了,我們使用裝飾器只需改變少量實參即可即可省去重復操作,因為我們把一部分重復操作封裝在裝飾函數中,@裝飾函數名。
帶參數的被裝飾函數
上面是不帶參數的裝飾器,下面是帶參數的裝飾器,注意:1、參數放在內部函數中#1;2、被裝飾的函數也要加上參數 看#2;定義被裝飾的函數有參數看#3、#4。3、定義被裝飾函數時(語法糖下面的函數是被裝飾函數),形參名字和上面的嵌套函數可以不一致。
1 print("---------------------------------------------------") 2 # 帶參數的裝飾器 3 def wai(func): 4 def nei(a,b): #參數放在內部函數中 #1 5 print('start') 6 func(a,b) #被裝飾函數調用也要加上參數 #2 7 print('stop') 8 return nei 9 @wai 10 def add(m,n): #加法 #3 11 return print(m+n) #參數名和嵌套函數中的參數名字可以不同。 12 add(4,5) 13 # 可以多次使用語法糖調用裝飾器 14 @wai 15 def sub(x,y): #減法 #4 16 return print(x-y) 17 sub(11,4)
執行結果如下:
?
帶參數的裝飾器(帶參數的語法糖)
不改變內部被裝飾函數,通過在語法糖(@裝飾函數名)后面添加實參和并且在裝飾函數再加一層外層函數
1 def add_chars(argv): 2 def wai(func): 3 def nei(a,b): 4 print('開始:%s'%argv) 5 func(a,b) 6 print('結束') 7 return nei 8 return wai 9 @add_chars('加法') #語法糖名字要和多層嵌套函數最外層函數名一致,并且參數對應最外層函數形參 10 def add(m,n): 11 return print(m,'+',n,'=',m+n) 12 add(4,6) 13 @add_chars('減法') # 14 def sub(x,y): #減法 15 return print(x,'-',y,'=',x-y) 16 sub(11,4) 17 # 裝飾器帶參數;在語法糖上帶參數 18 # 可以看到一層嵌套函數,出入的參數滿了,我們可以在最外面加一層嵌套函數執行結果如下:
小白學習筆記,如有理解錯誤,望批評指正,大佬止步。
轉載于:https://www.cnblogs.com/chxb/p/9849348.html
總結
以上是生活随笔為你收集整理的Python小白学习之函数装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10添加新用户
- 下一篇: Python基础--1.1Python基