問題舉例
有時候我們想為多個函式統一新增某種功能,比如計時統計、記錄日誌,快取運算結果等;
我們並不想在每個函式內一一新增完全相同的**,有什麼解決方案嗎?
定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式
**
defmemo(func):
cache ={}
def wrap(*args):
res =cache.get(args)
ifnot
res:
res = cache[args] = func(*args)
return
res
return
wrap
#[題目1] 斐波那契數列(fibonacci sequence):
#f(0)=1,f(1)=1, f(n)=f(n-1)+f(n-2)(n>=2)
#1, 1, 2, 3, 5, 8, 13, 21, 34, ...
#求數列第n項的值?
@memo
deffibonacci(n):
if n <= 1:
return 1
return fibonacci(n-1) + fibonacci(n-2)
#fibonacci = memo(fibonacci)
print(fibonacci(50))
#[題目2] 走樓梯問題
#有100階樓梯, 乙個人每次可以邁1~3階. 一共有多少走法?
@memo
defclimb(n, steps):
count =0
if n ==0:
count = 1
elif n >0:
for step in
steps:
count += climb(n-step, steps)
return
count
print(climb(100, (1,2,3)))
如何使用函式裝飾器?
需求 某些時候我們想為多個函式,統一新增某種功能,比如計時統計 日誌記錄 快取運算結果等等 我們不想在每個函式內一一新增完全相同的 有什麼好的解決方案?思路 定義裝飾器函式,用它來生成乙個在原函式基礎上新增了新功能的函式,替代原函式 def memo func cache def wrap args...
Python中如何使用裝飾器
把乙個函式當作引數,返回乙個替代版的函式 本質就是乙個返回函式的函式 在不改變原函式的基礎上,給函式增加功能 函式對修改是封閉的,對擴充套件是開放的 也就是說,是給乙個已經寫好的函式進行修改時,並不改變這個已經寫好的函式,而是再寫乙個函式來進行呼叫這個函式,但是在原本已經呼叫過這個函式的位置不能一一...
python中如何使用裝飾器
1.如果裝飾器是多層的,誰距離函式最近,則優先使用那個裝飾器 新增校驗功能的裝飾器 import time def verify1 t def decorate func print 第一層校驗正在進行中.time.sleep t print 校驗完畢!呼叫原函式 func args,kwargs ...