當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Functools用法及代碼示例


Functools 模塊用於處理其他函數的高階函數。它提供了與其他函數和可調用對象一起使用的函數,以使用或擴展它們而無需完全重寫它們。該模塊有兩個類——partial 和partialmethod。

部分類

偏函數是特定參數值的原始函數。可以使用 functools 庫中的 “partial” 在 Python 中創建它們。 __name__ 和 __doc__ 屬性由程序員創建,因為它們不是自動創建的。 partial() 創建的對象具有三個隻讀屬性: 語法:

partial(func, /, *args, **keywords)
  • partial.func- 它返回父函數的名稱以及十六進製地址。
  • partial.args- 它返回部分函數中提供的位置參數。
  • partial.keywords- 它返回部分函數中提供的關鍵字參數。

例子:

Python3


from functools import partial
def power(a, b):
    return a**b
# partial functions
pow2 = partial(power, b=2)
pow4 = partial(power, b=4)
power_of_5 = partial(power, 5)
print(power(2, 3))
print(pow2(4))
print(pow4(3))
print(power_of_5(2))
print('Function used in partial function pow2 :', pow2.func)
print('Default keywords for pow2 :', pow2.keywords)
print('Default arguments for power_of_5 :', power_of_5.args)
輸出
8
16
81
25
Function used in partial function pow2 : <function power at 0x7f8fcae38320>
Default keywords for pow2 : {'b': 2}
Default arguments for power_of_5 : (5,)

部分方法類

它是針對特定參數(例如部分函數)的已定義函數的方法定義。但是,它不可調用,而隻是一個方法說明符。它返回一個新的部分方法說明符。

用法:

partialmethod(func, *args, **keywords)

例子:

Python3


from functools import partialmethod
class Demo:
    def __init__(self):
        self.color = 'black'
    def _color(self, type):
        self.color = type
    set_red = partialmethod(_color, type='red')
    set_blue = partialmethod(_color, type='blue')
    set_green = partialmethod(_color, type='green')
obj = Demo()
print(obj.color)
obj.set_blue()
print(obj.color)

輸出:

black
blue

職能

Cmp_to_key 將比較函數轉換為關鍵函數。對於不同的條件,比較函數必須返回 1、-1 和 0。可用於sorted()、min()、max()等關鍵函數。

用法:

function(iterable, key=cmp_to_key(cmp_function)) 

例子:

Python3


from functools import cmp_to_key
# function to sort according to last character
def cmp_fun(a, b):
    if a[-1] > b[-1]:
        return 1
    elif a[-1] < b[-1]:
        return -1
    else:
        return 0
list1 = ['geeks', 'for', 'geeks']
l = sorted(list1, key = cmp_to_key(cmp_fun))
print('sorted list :', l)

輸出:

sorted list : ['for', 'geeks', 'geeks']

減少它對序列的元素重複應用兩個參數的函數,以便將序列減少到單個值。例如,reduce(lambda x, y: x^y, [1, 2, 3, 4]) 計算 (((1^2)^3)^4)。如果初始值存在,則將其放在計算的第一位,默認結果是序列為空時。

句法:

reduce(function, sequence[, initial]) -> value  

例子:

Python3


from functools import reduce
list1 = [2, 4, 7, 9, 1, 3]
sum_of_list1 = reduce(lambda a, b:a + b, list1)
list2 = ["abc", "xyz", "def"]
max_of_list2 = reduce(lambda a, b:a if a>b else b, list2)
print('Sum of list1 :', sum_of_list1)
print('Maximum of list2 :', max_of_list2)

輸出:

Sum of list1 : 26
Maximum of list2 : xyz

Total_ordering 它是一個類裝飾器,填補了缺失的比較方法(__lt__、__gt__、__eq__、__le__、__ge__)。如果給定的類定義了一種或多種比較方法,“@total_ordering” 將根據給定的定義自動提供其餘的方法。但是,該類必須定義 __lt__()、__le__()、__gt__() 或 __ge__() 之一,此外,該類還應提供 __eq__() 方法。

例子:

Python3


from functools import total_ordering
@total_ordering
class N:
    def __init__(self, value):
        self.value = value
    def __eq__(self, other):
        return self.value == other.value
    # Reverse the function of 
    # '<' operator and accordingly
    # other rich comparison operators
    # due to total_ordering decorator
    def __lt__(self, other):
        return self.value > other.value
print('6 > 2 :', N(6)>N(2))
print('3 < 1 :', N(3)<N(1))
print('2 <= 7 :', N(2)<= N(7))
print('9 >= 10 :', N(9)>= N(10))
print('5 == 5 :', N(5)== N(5))

輸出:

6 > 2 : False
3 < 1 : True
2 = 10 : True
5 == 5 : True

Update_wrapper 它更新包裝函數,使其看起來像包裝函數。例如,對於部分函數,我們可以使用 update_wrapper(partial,parent) 更新部分函數,使其看起來像其父函數。這會將部分函數的文檔(__doc__)和名稱(__name__)更新為與父函數相同。

用法:

update_wrapper(wrapper, wrapped[, assigned][, updated])

例子:

Python3


from functools import update_wrapper, partial
def power(a, b):
    ''' a to the power b'''
    return a**b
# partial function
pow2 = partial(power, b = 2)
pow2.__doc__='''a to the power 2'''
pow2.__name__ = 'pow2'
print('Before wrapper update -')
print('Documentation of pow2 :', pow2.__doc__)
print('Name of pow2 :', pow2.__name__)
print()
update_wrapper(pow2, power)
print('After wrapper update -')
print('Documentation of pow2 :', pow2.__doc__)
print('Name of pow2 :', pow2.__name__)

輸出:

Before wrapper update -
Documentation of pow2 : a to the power 2
Name of pow2 : pow2

After wrapper update -
Documentation of pow2 :  a to the power b
Name of pow2 : power

Wraps 它是一個函數裝飾器,它將update_wrapper()應用於被裝飾的函數。它相當於部分(update_wrapper,包=包,分配=分配,更新=更新)。

例子:

Python3


from functools import wraps
def decorator(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        """Decorator's docstring"""
        return f(*args, **kwargs)
    print('Documentation of decorated :', decorated.__doc__)
    return decorated
@decorator
def f(x):
    """f's Docstring"""
    return x
print('f name :', f.__name__)
print('Documentation of f :', f.__doc__)

輸出:

Documentation of decorated : f's Docstring
f name : f
Documentation of f : f's Docstring

LRU_cache LRU_cache 是一個函數裝飾器,用於保存最多 maxsize 的函數最近調用。如果使用相同的參數重複調用,這可以節省時間和內存。如果 *maxsize* 設置為 None,則緩存可以無限增長。如果 *typed* 為 True,則不同數據類型的參數將單獨緩存。例如,f(1.0) 和 f(1) 將被不同地 memory 。

用法:

lru_cache(maxsize=128, typed=False)

例子:

Python3


from functools import lru_cache
@lru_cache(maxsize = None)
def factorial(n):
    if n<= 1:
        return 1
    return n * factorial(n-1)
print([factorial(n) for n in range(7)])
print(factorial.cache_info())

輸出:

[1, 1, 2, 6, 24, 120, 720]
CacheInfo(hits=5, misses=7, maxsize=None, currsize=7)

SingleDispatch 它是一個函數裝飾器。它將函數轉換為通用函數,以便它可以根據第一個參數的類型具有不同的行為。它用於函數重載,重載的實現使用register()屬性注冊。

例子:

Python3


from functools import singledispatch
@singledispatch
def fun(s):
    print(s)
@fun.register(int)
def _(s):
    print(s * 2)
fun('GeeksforGeeks')
fun(10)

輸出:

GeeksforGeeks
20


相關用法


注:本文由純淨天空篩選整理自naina024大神的英文原創作品 Functools module in Python。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。