1. 程式人生 > >python全棧開發從入門到放棄之裝飾器函數

python全棧開發從入門到放棄之裝飾器函數

def return app 不改變 art sdl 兩個 time() 必須

1、函數名可以當作函數的參數

 1 import time
 2 def timmer(func):
 3     #函數名可以當做函數的參數
 4     def inner():
 5         start = time.time()
 6         func()
 7         end = time.time()
 8         print(end - start)      
 9     return inner
10 
11 def hahaha():
12     time.sleep(0.1)
13     print(aaaa)
14 
15 hahaha()
16 17 輸出結果 18 aaaa

2、假如我們不能修改這個函數的調用方式,也不能修改原代碼,該怎麽做到呢

 1 import time
 2 def timmer(func):
 3     #函數名可以當做函數的參數
 4     def inner():
 5         start = time.time()
 6         func()
 7         end = time.time()
 8         print(end - start)
 9     return inner
10 
11 def hahaha():
12     time.sleep(0.1)
13 print(aaaa) 14 15 hahaha = timmer(hahaha) #timmer函數的地址給了hahaha 然後在進行調用 16 hahaha() 17 18 aaaa 19 0.10033607482910156

# hahaha = timmer(hahaha) #timmer函數的地址給了hahaha
# hahaha() #實際上執行的是timmer

3、函數傳參

 1 def timmer(func):  #---> hahaha
 2     def inner(*args,**kwargs):         #動態參數接收從kkk傳來的1,2並進行壓縮成元組
3 #args == (1,2) kwargs == {} 4 #*args == 1,2 **kwargs == a =1,b = 2 5 func(*args,**kwargs) # ---》kkk #func把值傳給kkk並還原,實際上就是解壓之前動態參數接收的壓縮的值,返回給kkk函數 6 return inner 7 8 9 def kkk(a,b): 10 print(a) 11 12 kkk = timmer(kkk) #timmer函數裏的func是kkk函數,然後返回inner函數給kkk 13 kkk(1,2) #kkk函數調用並傳參給inner(動態參數*args), 14 15 1

參數
#實參:調用函數的時候傳入的參數
#形參
#位置參數:必須傳值

1 def aaa(a,b):
2 print(a,b)
3 aaa(1,2)


#默認參數:可以不傳

1 def bbb(x=10):      #默認參數 沒上傳參數的話用默認的參數,上傳的話會用上傳的參數。
2 print(x)
3 bbb() #x = 10
4 bbb(20) #x = 20

#動態參數

1 def ccc(*args):#1,2,3,4,5     #*args  會將ccc上傳的參數以元組的方式存放 
2 print(args)
3 
4 ccc(1,2,3,4,5)#按位置傳參數

解壓傳參

1 def ccc(*args):#1,2,3,4,5
2     print(args)
3 
4 #ccc(1,2,3,4,5)#按位置傳參數
5 
6 t = (1,2,3,4,5)
7 ccc(t) # ((1, 2, 3, 4, 5),)
8 ccc(*t)  #(1, 2, 3, 4, 5)   #解壓

按關鍵字傳參

1 def ddd(**kwargs):   #kwargs接收傳參然後以字典的方式存放
2     print(kwargs)
3 
4 ddd(k = a,j = b)#按關鍵字傳參數

打散賦值

 1 def ccc(*args):
 2     print(ccc:,args)  #(1,2,3,4,5)
 3     def inner(a,b,c,d,e):
 4         print(inner,a,b,c,d,e)
 5     inner(*args)  #*(1,2,3,4,5)  打散
 6 
 7 def inner(a,b,c,d,e):     #接收解壓的參數然後一一賦值
 8     print(inner,a,b,c,d,e)
 9 ccc(1,2,3,4,5)
10 inner(1,2,3,4,5)

4、語法糖

 1 def timmer(func):  #---> jjj
 2     def inner(*args,**kwargs):
 3         ret = func(*args,**kwargs)  # --->ret = jjj()
 4         print(ret)
 5         return ret
 6     return inner
 7 
 8 @timmer  #jjj = timmer(jjj)  語法糖
 9 def jjj():
10     return 123
11 
12 
13 jjj()     #ret = jjj()
14 
15 
16 輸出結果
17 123

5、裝飾器函數

#裝飾器的本質 :閉包函數
#功能:就是在不改變原函數調用方式的情況下,在這個函數前後加上擴展功能
def timmer(func):
def inner(*args,**kwargs):
‘‘‘添加函數調用之前的擴展代碼‘‘‘
ret = func(*args,**kwargs)
‘‘‘添加函數調用之後的擴展代碼‘‘‘
return ret
return inner
#設計模式 原則 開放封閉原則
#對擴展是開放的
#對修改是封閉的

6、裝飾器裝飾兩個函數

 1 def wrapper(func):#裝飾
 2     def inner(*args,**kwargs):
 3 
 4         ret = func(*args,**kwargs)
 5 
 6         return ret
 7     return inner
 8 
 9 @wrapper        #aaa = wrapper(aaa)
10 def aaa():
11     print(asghksdlhf)
12 
13 @wrapper        #bbb = wrapper(bbb)
14 def bbb():
15     print(asghksdlhf)
16 
17 
18 aaa()
19 bbb()
20 
21 
22 #輸出結果:
23 #asghksdlhf
24 #asghksdlhf

7、

python全棧開發從入門到放棄之裝飾器函數