Pythgon的functools

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)