functools模塊里面放了很多的工具函數,此處我們只介紹常用到的兩個:
-
partial函數(偏函數):綁定了一部分參數的函數。作用就是少傳參數,更短,更簡潔。
-
wraps函數:避免多個函數被兩個裝飾器裝飾時就報錯,因為兩個函數名一樣,第二個函數再去裝飾的話就報錯,最好是加上這個,代碼更加健壯
# partial函數(偏函數) from functools import partial # 案例1 def add(a, b): return a + b add(1, 2) 3 plus3 = partial(add, 1) plus5 = partial(add, 2) plus3(2) 3 plus5(1) 3 # 案例2 >>> partial_sorted = partial(sorted,reverse=True) >>> partial_sorted(list1) [123, 53, 34, 23] # 案例3 def showarg(*args, **kw): print(args) print(kw) >>> p1=partial(showarg, 1,2,3) >>> p1() (1, 2, 3) {} >>> p1(4,5,6) (1, 2, 3, 4, 5, 6) {} >>> p1(a='python', b='itcast') (1, 2, 3) {'a': 'python', 'b': 'itcast'} >>> p2=partial(showarg, a=3,b='linux') >>> p2() () {'a': 3, 'b': 'linux'} >>> p2(1,2) (1, 2) {'a': 3, 'b': 'linux'} >>> p2(a='python', b='itcast') () {'a': 'python', 'b': 'itcast'} # wraps函數:添加裝飾器后由於函數名和函數的doc發生了改變,所有此方法來消除這樣的副作用 def note(func): def wrapper(func): print('note something') return func() return wrapper @note def test(): print('I am test') test() print(test.__doc__) print(test.__name__) note something I am test wrapper function # 這里結果就發生了改變,本來應該是test function,是因為裝飾器影響的 wrapper # 這里的name屬性也被裝飾器影響到了,本應該是 test ----------------------------------------------------------------------------------------------- import functools def note(func): @functools.wraps(func) def wrapper(func): print('note something') return func() return wrapper @note def test(): print('I am test') test() print(test.__doc__) print(test.__name__) note something I am test test function # 使用@functools.wraps(func)裝飾器后,這個就不會受到影響了 test # reduce 從左到右對一個序列的項累計地應用有兩個參數的函數,以此合並序列到一個單一值。 from functools import reduce >>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) # 計算的就是((((1+2)+3)+4)+5) 15