裝飾器,匿名函式

林堯彬發表於2019-03-18

裝飾器

裝飾器的開放封閉原則:

裝飾器對擴充套件是開放的,對修改原始碼是封閉的,不能改變原函式的呼叫方式

 1 基本完整的裝飾器函式示例
 2 import time                                       #時間模組
 3 def warpper(f):                                 #接受被裝飾的函式記憶體地址
 4     def inner(*args,**kwargs):           #接受被裝飾函式的引數  inner裡面函式是擴充套件的功能
 5         strat_time = time.time()           #計時功能
 6         ret = f(*args,**kwargs)           #呼叫被裝飾的函式,帶著被裝飾函式的引數
 7         end_time = time.time()             #計時功能
 8         print('%s函式的執行時間:%s'%(f.__name__,end_time-start_time))
 9                                                         #計時功能
10         return ret                                  #被裝飾函式的返回值
11     return inner                                   #通過這一步令func() = inner()
12 
13 @warpper                                         #語法糖,相當於func = warpper(func)
14 def func(*args,**kwargs):                #被裝飾函式
15     print(args)                                    #主函式功能
16     print('這是主功能')                          #主函式功能
17     time.sleep(1)                                #計時功能
18     return '你好'                                  #被裝飾函式的返回值,返回到inner裡的ret
19 #其實語法糖縮寫的函式位置在這裡,此處相當於有一個func = warpper(func)
20 ret = func(5)                                    #func(5) = inner(5)  此處的ret來自inner
21 print(ret)                                          #ret是func的return,但不由func返回

內建函式  :

匿名函式lambda: 為了解決那些功能很簡單的需求而設計的一句話函式

引數可以有多個,用逗號隔開

匿名函式不管邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值

返回值和正常的資料一樣可以是任意資料型別

排序函式sorted:

字典排序返回的就是排序後的key

和lambda組合使用:

篩選過濾filter:

對映函式map

改寫成lambda

reduce:

reduce的使用方式

reduce(函式名,可迭代物件)  這兩個引數必須要有,缺一不行

和lambda一起使用

在Python2.x版本中recude是直接 import就可以的, Python3.x版本中需要從functools這個包中匯入

龜叔本打算將 lambda 和 reduce 都從全域性名字空間都移除, 輿論說龜叔不喜歡lambda 和 reduce

最後lambda沒刪除是因為和一個人寫信寫了好多封,進行交流然後把lambda保住了

 

 

 

相關文章