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
相關用法
- Python Functools cached_property()用法及代碼示例
- Python Functools lru_cache()用法及代碼示例
- Python Functools total_ordering()用法及代碼示例
- Python Functools update_wrapper()用法及代碼示例
- Python File next()用法及代碼示例
- Python File close()用法及代碼示例
- Python File fileno()用法及代碼示例
- Python File flush()用法及代碼示例
- Python File isatty()用法及代碼示例
- Python File open()用法及代碼示例
- Python File read()用法及代碼示例
- Python File readable()用法及代碼示例
- Python File readline()用法及代碼示例
- Python File readlines()用法及代碼示例
- Python File seek()用法及代碼示例
- Python File seekable()用法及代碼示例
- Python File tell()用法及代碼示例
- Python File writable()用法及代碼示例
- Python File write()用法及代碼示例
- Python File writelines()用法及代碼示例
- Python File truncate()用法及代碼示例
- Python Float轉Int用法及代碼示例
- Python FreeGames用法及代碼示例
- Python Fontstyle用法及代碼示例
- Python Fraction用法及代碼示例
注:本文由純淨天空篩選整理自naina024大神的英文原創作品 Functools module in Python。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。