Python庫functools示例詳解
functools
functools 是 Python 標準庫中一個極為實用的模塊,提供了許多用于處理函數(shù)、高階函數(shù)以及函數(shù)式編程的工具。
1. functools.partial
用途: 創(chuàng)建一個新函數(shù),它固定了原函數(shù)的部分參數(shù)。
示例:
from functools import partial
def power(base, exponent):
return base ** exponent
# 創(chuàng)建一個固定底數(shù)為2的新函數(shù)
square = partial(power, base=2)
# 調(diào)用新函數(shù)只需傳遞指數(shù)
print(square(3)) # 輸出: 8
2. functools.update_wrapper / functools.wraps
用途: 在編寫裝飾器時,保持被裝飾函數(shù)的元信息(如名稱、文檔字符串、注解等)不變。
示例:
from functools import wraps
def add_logging(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with arguments {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"{func.__name__} returned: {result}")
return result
return wrapper
@add_logging
def greet(name):
"""Greet someone by their name."""
return f"Hello, {name}!"
print(greet.__name__) # 輸出: greet
print(greet.__doc__) # 輸出: Greet someone by their name.
greet("Alice") # 輸出: Calling greet with arguments ('Alice',), {} 和 "greet returned: Hello, Alice!"
3. functools.total_ordering
用途: 通過實現(xiàn)一個或少數(shù)幾個關(guān)鍵比較方法(如 __eq__ 和 __lt__),自動為一個類生成所有必要的比較方法(如 __le__, __gt__, __ge__, __ne__)。
示例:
from functools import total_ordering
@total_ordering
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.name == other.name and self.age == other.age
def __lt__(self, other):
return self.age < other.age
# 自動擁有所有比較方法,如 __le__, __gt__, __ge__, __ne__
p1 = Person("Alice", 25)
p2 = Person("Bob", 30)
print(p1 <= p2) # 輸出: True
print(p1 > p2) # 輸出: False
4. functools.lru_cache
用途: 實現(xiàn)函數(shù)結(jié)果的緩存,以提高性能?;凇白罱钌偈褂谩保↙east Recently Used, LRU)策略自動丟棄舊的緩存項。
示例:
from functools import lru_cache
@lru_cache(maxsize=32)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
# 多次調(diào)用相同參數(shù)時,從緩存中獲取結(jié)果,避免重復(fù)計算
print(fibonacci(20)) # 第一次調(diào)用進行計算
print(fibonacci(20)) # 第二次調(diào)用直接使用緩存
5. functools.reduce
用途: 對一個可迭代對象(如列表)應(yīng)用一個累積函數(shù),從左到右將元素兩兩結(jié)合,返回單一結(jié)果。
示例:
from functools import reduce
numbers = [1, 2, 3, 4, 5]
# 計算列表元素的乘積
product = reduce(lambda x, y: x * y, numbers)
print(product) # 輸出: 120
6. functools.cmp_to_key
用途: 將舊式的比較函數(shù)(接受兩個參數(shù)并返回負數(shù)、零或正數(shù)表示小于、等于或大于)轉(zhuǎn)換為可用于排序的鍵函數(shù)。
示例:
from functools import cmp_to_key
def compare_names(name1, name2):
if name1 < name2:
return -1
elif name1 > name2:
return 1
else:
return 0
names = ["Alice", "Bob", "Charlie", "David"]
# 使用舊式比較函數(shù)進行排序
sorted_names = sorted(names, key=cmp_to_key(compare_names))
print(sorted_names) # 輸出: ['Alice', 'Bob', 'Charlie', 'David']
以上示例
涵蓋了 functools 模塊中一些常用且重要的功能,包括部分函數(shù)應(yīng)用、裝飾器元信息保留、簡化類比較方法、函數(shù)緩存、累積計算以及舊式比較函數(shù)的轉(zhuǎn)換。根據(jù)實際需求,可以靈活運用這些工具來增強代碼的簡潔性、效率和可讀性。