裝飾器就是對被裝飾的物件(函式、類)進行重構的,其可以在不改變原來物件的情況下呼叫物件時執行重構後的行為
1.解決問題:在函式執行之前和執行之後新增功能,呼叫函式的方式改變了
2.不改變原有函式的呼叫方法:函式裡面巢狀函式,並且返回巢狀的函式
在python中,可以使用」@」語法糖來精簡裝飾器的**,把 decorator 置於函式的定義處,免去給函式重新賦值( 即function = decorator(funtion))
使用例項說明
import functools #functools 標準庫
import time #time 時間函式
def add_log(fun):
@functools.wraps(fun) #不用此模組add(x,y)函式的__name__,__doc__都會丟失
start_time = time.time()
res = fun(*args,**kwargs)
end_time = time.time()
print("[%s] 函式名:%s, 執行時間 :%.5f ,執行返回值:% d"
%(time.ctime(),fun.__name__,end_time- start_time,res))
return res #返回值為所要裝飾的函式
@add_log ##呼叫語法糖
def add(x,y):
time.sleep(0.1)
return x+y
print(add(1,2))
def timeit(fun):
#args:元組 kwargs:字典 args=(5,)
#原函式執行之前
start_time = time.time()
#執行函式
res = fun(*args,**kwargs) #args解包
#執行函式
end_time = time.time()
print("執行時間為:%.6f" % (end_time - start_time))
return res
@timeit
def list_create(n):
return(i*2 for i in range(n)])
@timeit
def map_create(n):
return(list(map(lambda x:x*2,range(n))))
list_create(5)
map_create(5)
import functools
def timeit(fun):
"""這是乙個裝飾器timeit"""
@functools.wraps(fun) ##內建裝飾器
可以保留被裝飾的函式的函式名和幫助文件資訊
#args:元組 kwargs:字典 args=(5,)
#原函式執行之前
start_time = time.time()
#執行函式
res = fun(*args,**kwargs) #args解包
#執行函式
end_time = time.time()
print("執行時間為:%.6f" % (end_time - start_time))
return res
@timeit
def fun():
print("hello")
print(fun_list.__name__)
print(fun_list.__doc__)
def makebold(fun):
print("bold1")
print("bold2")
def makei(fun): # fun=login
print("i1")
print("i2")
return fun(*args, **kwargs)
# 當有多個裝飾器時,從上到下呼叫裝飾器
def login():
return "登陸"
print(login())
import datetime
import time
def check(sec):
def inc(dest):
dest.__name__=sec.__name__
dest.__doc__=sec.__doc__
print(dest.__name__,dest.__doc__)
print(dest)
return dest
return inc
def wraps(durang):
def wraps(fn):
@check(fn)#----------此處為單參裝飾器
def wrapsd(*args,**kwargs):
'''xiaoliuchangzuimei''
start=datetime.datetime.now()
set=fn(*args,**kwargs)
derta=(datetime.datetime.now()-start)
if durang>5:
print(durang)
return set,derta
return wrapsd
return wraps
@wraps(5)
def add(x,y):
'''xiaohuihuizuishuai'''
time.sleep(5)
return x+y
import functools
def add(x,y)->int
return x+y
newadd=functools.partial(add,y=5)
print(newadd(7))
*reduce 方法,顧名思義就是減少
*reduce(function,sequence[,inital ])->value
form functools import reduce
nums=[6,9,7,8,5,4]
print(nums)
print(sum(nums))
print(reduce (lambda val,x:val+x,nums))
歡迎志同道合的朋友:成為小灰灰的朋友
python 函式高階 python 函式高階
形參角度 萬能引數 動態接收位置引數 args 動態接收關鍵字引數 kwargs 的魔性用法 函式定義時 代表聚合。他將所有的位置引數 聚合成乙個元組,賦值給了args 函式定義時 將所有的關鍵字引數聚合成乙個字典中,將這個字典賦給了 kwargs 和 在函式的呼叫時 代表打散 僅限關鍵字引數 de...
Python高階 函式高階
閉包 closure 常規函式中可以在函式的引數中新增引數的預設值來簡化函式的操作,偏函式也可以做到這一點,而且會更加的方便管理函式的操作。通過內建模組functools的partial進行定義和處理 語法結構 新函式名稱 functools.partial 函式名稱,預設賦值引數 例如 全域性函式...
python 函式 高階函式
filter 函式是 python 內建的另乙個有用的高階函式,filter 函式接收乙個函式 f 和乙個list,這個函式 f 的作用是對每個元素進行判斷,返回 true或 false,filter 根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。例如判斷奇偶數 def...