python常用模塊-functools模塊


functools模塊

  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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM