裝飾器本質就是函式,功能是為其他函式新增附加功能。
原則:不修改被修飾函式的源**
不修改被修飾函式的呼叫方式
裝飾器的知識儲備:
裝飾器=高階函式+函式巢狀+閉包
import time
# 定義乙個裝飾器計算函式執行時間
def timer(func):
start_time = time.time()
res = func(*args, **kwargs)
stop_time = time.time()
print('函式執行時間是%s' % (stop_time - start_time))
return res
@timer
def func(arr):
res = 0
for i in arr:
time.sleep(0.1)
res += i
return i
print(func(range(20)))
高階函式
函式接收的引數是乙個函式名
函式的返回值是乙個函式名
滿足上面任意乙個都可稱之為高階函式
不修改被修飾函式源**
import time
def foo():
time.sleep(0.3)
print('moring sir')
def bar(func):
star_time = time.time()
func()
stop_time = time.time()
print('函式執行時間是%s' % (stop_time - star_time))
bar(foo)
# moring sir
# 函式執行時間是0.3008232116699219
不修改函式呼叫方式def foo():
print('hello world')
def bar(func):
return func
foo = bar(foo)
foo()
# hello world
單純的高階函式實現不了裝飾器
import time
def foo():
time.sleep(3)
print('hello world')
def bar(func):
start_time = time.time()
func()
stop_time = time.time()
print('函式執行時間是%s' % (stop_time - start_time))
return func
foo = bar(foo)
foo()
# hello world
# 函式執行時間是3.000910997390747
# hello world
函式巢狀
函式巢狀是在函式裡面定義乙個函式,注意不是呼叫。
def outer(name):
def inner():
def nice():
print('nice %s' % name)
nice()
inner()
outer('cuci')
# nice cuci
閉包
實現裝飾器
# 匯入時間模組
import time
# 定義裝飾器,裝飾器就是高階函式 + 函式巢狀 + 閉包
def timer(func): # func = test
# 函式巢狀
# 閉包
# func函式開始執行的時間
start_time = time.time()
func() # test()
# func函式執行結束時間
end_time = time.time()
print('函式執行時間 %s' % (start_time - end_time))
# @time 相當於做了 test = timer(test)
@timer
def test():
time.sleep(3)
print('test 函式執行完畢!')
# test = timer(test)
test()
加上返回值
# 匯入時間模組
import time
# 定義裝飾器,裝飾器就是高階函式 + 函式巢狀 + 閉包
def timer(func): # func = test
# 函式巢狀
# 閉包
# func函式開始執行的時間
start_time = time.time()
res = func() # test()
# func函式執行結束時間
end_time = time.time()
print('函式執行時間 %s' % (start_time - end_time))
return res
# @time 相當於做了 test = timer(test)
@timer
def test():
time.sleep(3)
print('test 函式執行完畢!')
return '這是test'
# test = timer(test)
res = test()
print(res)
傳遞引數# 匯入時間模組
import time
# 定義裝飾器,裝飾器就是高階函式 + 函式巢狀 + 閉包
def timer(func): # func = test
# 函式巢狀
# 閉包
# func函式開始執行的時間
start_time = time.time()
res = func(*args, **kwargs) # test(*args, **kwargs)
# func函式執行結束時間
end_time = time.time()
print('函式執行時間 %s' % (start_time - end_time))
return res
# @time 相當於做了 test = timer(test)
@timer
def test(name, age):
time.sleep(3)
print('test 函式執行完畢!', name, age)
return '這是test'
# test = timer(test)
res = test('alex', 23)
print(res)
python基礎 裝飾器
裝飾器形成的過程 最簡單的裝飾器 有返回值的 有乙個引數 萬能引數 裝飾器的作用 原則 開放封閉原則 語法糖 裝飾器的固定模式 import time print time.time 獲取當前時間 time.sleep 10 讓程式在執行到這個位置的時候停一會兒 def timmer f 裝飾器函式...
Python基礎 裝飾器
裝飾器是程式開發中經常會用到的乙個功能,程式開發的基礎知識,用好了裝飾器,開發效率如虎添翼,所以這也是python面試中必問的問題,但對於好多初次接觸這個知識的人來講,這個功能有點繞,這個都不會,別跟人家說你會python,看了下面的文章,保證你學會裝飾器。裝飾器 decorator 首先我們需要知...
python基礎 裝飾器
一 裝飾器定義 器即函式 裝飾即修飾,意指為其他函式新增新功能 裝飾器定義 本質就是函式,功能是為其他函式新增新功能 二 裝飾器需遵循的原則 1.不修改被裝飾函式的源 開放封閉原則 2.為被裝飾函式新增新功能後,不修改被修飾函式的呼叫方式 三 實現裝飾器知識儲備 裝飾器 高階函式 函式巢狀 閉包 四...