如何使用函式裝飾器?

2022-06-22 11:57:12 字數 1195 閱讀 9262

需求:

某些時候我們想為多個函式,統一新增某種功能,比如計時統計、日誌記錄、快取運算結果等等

我們不想在每個函式內一一新增完全相同的**,有什麼好的解決方案?

思路:定義裝飾器函式,用它來生成乙個在原函式基礎上新增了新功能的函式,替代原函式

**:

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...