Pythgon的functools
已于 2025年09月01日 14:39 修改
访问次数:0
functools 是 Python 标准库里的一个功能性工具模块,专门提供一些用于高阶函数(函数作为参数或返回值)和可调用对象的工具。它能帮你写出更简洁、灵活、高效的代码。
1. functools.partial
创建一个偏函数,固定住部分参数,生成一个新的函数。
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2) # 固定 exponent=2
cube = partial(power, exponent=3) # 固定 exponent=3
print(square(5)) # 25
print(cube(4)) # 64
2. functools.lru_cache
给函数结果做缓存(memoization),加速重复计算。
from functools import lru_cache
@lru_cache(maxsize=128) # 最多缓存128个结果
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(30)) # 只会真正算一次
3. functools.wraps
在写装饰器时保留被装饰函数的元信息(__name__、__doc__等)。
from functools import wraps
def my_decorator(func):
@wraps(func) # 不加这个,被装饰函数的名字会变成内部函数名
def wrapper(*args, **kwargs):
print("Before function")
return func(*args, **kwargs)
return wrapper
@my_decorator
def hello():
"""Say hello"""
print("Hello!")
print(hello.__name__) # hello(如果没用wraps,这里是 wrapper)
print(hello.__doc__) # Say hello
4. functools.reduce
把一个函数连续作用于序列元素上(常用于累积计算)。
from functools import reduce
nums = [1, 2, 3, 4]
result = reduce(lambda x, y: x * y, nums)
print(result) # 24,相当于 (((1*2)*3)*4)
5. functools.total_ordering
用最少的比较运算符实现完整的排序比较。
from functools import total_ordering
@total_ordering
class Person:
def __init__(self, age):
self.age = age
def __eq__(self, other):
return self.age == other.age
def __lt__(self, other):
return self.age < other.age
print(Person(20) < Person(30)) # True
print(Person(20) >= Person(30)) # False (自动生成了 >=)
6. functools.singledispatch
实现函数的泛型调度(单分派泛型函数)。
from functools import singledispatch
@singledispatch
def show(obj):
print("Default:", obj)
@show.register(int)
def _(obj):
print("Integer:", obj)
@show.register(list)
def _(obj):
print("List:", obj)
show(42) # Integer: 42
show([1, 2, 3]) # List: [1, 2, 3]
show("hi") # Default: hi
总结
functools 主要工具:
- 函数处理:partial, wraps, reduce
- 性能优化:lru_cache
- 比较与排序:total_ordering, cmp_to_key
- 泛型与调度:singledispatch
评论(0)