44 使用函式裝飾器

2021-10-02 20:08:42 字數 1957 閱讀 2259

某些時候我們想問多個函式統一新增某種功能,比如計時統計、記錄日誌、快取運算結果等等。我們不想在每個函式內新增完全相同的**,如何更好的達成目的呢?

要求:不在每個函式內新增完全相同的**的前提下實現功能。

解決方案:

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

python的裝飾器decorator本質上是乙個高階函式,它接收乙個函式作為引數,然後返回乙個新的函式,可以讓該函式在不改動源**的情況下增加其他新功能。

python通過乙個語法糖@符號來使用decorator,這樣可以避免編寫f = decorate(f)這樣形式的**。所謂的語法糖便是你不使用也可以完成任務,但是使用它可以讓你的**更簡潔。

對於裝飾器,需要記住的就是

@decorate

deff()

:pass

其中,

@decorate   等價於  f = decorate(f)
1

. 斐波那契數列

deffib

(n):

if n <=1:

return

1return fib(n-1)

+ fib(n-2)

print

(fib(50)

)2. 走台階問題

# 台階有100階,乙個人每次可以走1~3階。有多少種走法?

defclimb

(n, steps)

: count =

0if n ==0:

count =

1elif n >0:

for step in steps:

count += climb(n-step, steps)

return count

print

(climb(

100,(1

,2,3

)))

對於求斐波那契數列,遞迴過程中會反覆求值,造成演算法效率低;走台階問題也是如此。

如何提高上面兩函式的演算法效率,可以通過裝飾器函式來快取運算結果。

def

memo

(func)

: cache =

defwrap

(*args)

: res = cache.get(args)

ifnot res:

res = cache[args]

= func(

*args)

return res

return wrap

@memo #等價於 fib = memo(fib)

deffib

(n):

if n <=1:

return

1return fib(n-1)

+ fib(n-2)

print

(fib(50)

)@memo #等價於 climb = memo(climb)

defclimb

(n, steps)

: count =

0if n ==0:

count =

1elif n >0:

for step in steps:

count += climb(n-step, steps)

return count

print

(climb(

100,(1

,2,3

)))

結果:

20365011074

180396380815100901214157639

有了裝飾器函式裝飾之後,會很快得到運算結果,大大提高了演算法效率。

python裝飾器 如何使用函式裝飾器

問題舉例 有時候我們想為多個函式統一新增某種功能,比如計時統計 記錄日誌,快取運算結果等 我們並不想在每個函式內一一新增完全相同的 有什麼解決方案嗎?定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式 def memo func cache def wrap args res ...

Python基礎 44 裝飾器詳解

裝飾器的簡單功能在前面已經有過介紹 裝飾器基礎 本篇詳細介紹一下裝飾器的作用 部分 在每個函式執行前列印出執行的函式名稱 def print log func print 當前執行的函式名為 func.name func print log def send word print 正在執行send ...

如何使用函式裝飾器?

需求 某些時候我們想為多個函式,統一新增某種功能,比如計時統計 日誌記錄 快取運算結果等等 我們不想在每個函式內一一新增完全相同的 有什麼好的解決方案?思路 定義裝飾器函式,用它來生成乙個在原函式基礎上新增了新功能的函式,替代原函式 def memo func cache def wrap args...