需求:
某些時候我們想為多個函式,統一新增某種功能,比如計時統計、日誌記錄、快取運算結果等等
我們不想在每個函式內一一新增完全相同的**,有什麼好的解決方案?
思路:定義裝飾器函式,用它來生成乙個在原函式基礎上新增了新功能的函式,替代原函式
**:
def memo(func):
cache = {}
def wrap(*args):
res = cache.get(args) # 此處args傳入的是乙個元組,元組可以作為字典的鍵
if not 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 # 等價於fibonacci = memo(fibonacci)
def fibonacci(n):
if n <= 1:
return 1
res = fibonacci(n-1) + fibonacci(n-2)
return res
# [題目2] 走樓梯問題
# 有100階樓梯,乙個人可以邁1~3階,一共有多少走法?
@memo
def climb(n,steps):
count = 0
if n == 0:
count = 1
elif n > 0:
for step in steps:
count += climb(n-step,steps)
return count
# fibonacci = memo(fibonacci) # 偷梁換柱,使用者直接呼叫的還是fibonacci,不感知函式內部
print(fibonacci(50))
# climb = memo(climb) # 偷梁換柱,使用者直接呼叫的還是climb,不感知函式內部
print(climb(100,(1,2,3)))
python裝飾器 如何使用函式裝飾器
問題舉例 有時候我們想為多個函式統一新增某種功能,比如計時統計 記錄日誌,快取運算結果等 我們並不想在每個函式內一一新增完全相同的 有什麼解決方案嗎?定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式 def memo func cache def wrap args res ...
44 使用函式裝飾器
某些時候我們想問多個函式統一新增某種功能,比如計時統計 記錄日誌 快取運算結果等等。我們不想在每個函式內新增完全相同的 如何更好的達成目的呢?要求 不在每個函式內新增完全相同的 的前提下實現功能。解決方案 定義裝飾器函式,用它生成乙個在原函式基礎上新增了新功能的函式,替代原函式。python的裝飾器...
裝飾器如何裝飾乙個函式
裝飾器如何裝飾乙個函式?今天番茄加速就來講一下。printstar函式接收乙個函式f,返回值也是乙個函式,所以滿足裝飾器的結構要求,所以printstar是乙個裝飾器。def printstar f def g print 20 f print 20 return g printstar裝飾器實現f...