Python函数式编程核心:functools模块完全指南

一、模块定位

functools 是 Python 标准库中用于高阶函数操作的核心模块,提供函数式编程工具和装饰器,主要用于:

  • 函数行为增强与元数据管理
  • 函数参数操作与柯里化
  • 方法重载与缓存优化
  • 面向对象方法的增强支持

二、核心功能详解

1. 缓存优化器 @lru_cache

参数说明

  • maxsize:整数类型,指定缓存的最大容量。当设置为None时表示无限制。默认为128
  • typed:布尔类型,当设置为True时,不同类型的参数将被视为不同的缓存条目。默认为False

功能特性

  • 自动缓存函数调用结果,避免重复计算
  • 基于最近最少使用算法(LRU)淘汰缓存
  • 提供cache_info()方法查看缓存状态
  • 提供cache_clear()方法清除缓存

典型场景

from functools import lru_cache

@lru_cache(maxsize=256)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 计算第50项斐波那契数
print(fibonacci(50))
# 查看缓存状态
print(fibonacci.cache_info())

2. 元数据保护器 @wraps

参数说明

  • wrapped:必需参数,指定被装饰的原始函数

功能特性

  • 保留原始函数的__name____doc____module__等属性
  • 维护调试信息的准确性
  • 保持函数签名完整性

使用规范

from functools import wraps

def logger(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        """包装函数的文档字符串"""
        print(f"调用函数:{
     func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@logger
def calculate(x, y):
    """计算两个数的和"""
    return x + y

# 测试元数据保护
print(calculate.__name__)  # 输出 'calculate'
print(calculate.__doc__)   # 输出 '计算两个数的和'

3. 参数固化器 partial

参数说明

  • func:必需参数,指定需要预设参数的基准函数
  • *args:可变位置参数,用于预设位置参数
  • **keywords:可变关键字参数,用于预设关键字参数

功能特性

  • 创建新的可调用对象,固定部分参数值
  • 支持位置参数和关键字参数的固化
  • 返回的partial对象具有与原始函数一致的元数据

典型应用

from functools import partial

# 创建固定精度的浮点数转换器
round_two = partial(round, ndigits=2)
print(round_two(3.14159))  # 输出 3.14

# 创建URL构建器
build_url = partial(requests.get, timeout=5)
# 使用:response = build_url("https://api.example.com/data")

4. 累积计算器 reduce

参数说明

  • function:必需参数,指定一个接收两个参数的累积函数
  • iterable:必需参数,提供需要累积计算的数据集
  • initializer:可选参数,指定初始计算值

功能特性

  • 对可迭代对象中的元素进行累积计算
  • 每次将当前累积结果与下一个元素作为参数传递给累积函数
  • 当初始值未提供且可迭代对象为空时,抛出TypeError

数学场景

from functools import reduce
import operator

# 计算阶乘
factorial = lambda n: reduce(operator.mul, range(1, n+1), 1)
print(factorial(5))  # 输出 120

# 合并嵌套列表
nested = [[1, 2], [3, 4], [5, 6]]
flatten = reduce(lambda x, y: x + y, nested)
print(flatten)  # 输出 [1, 2, 3, 4, 5, 6]

5. 方法重载器 @singledispatch

参数说明

  • 无直接参数,作为装饰器使用在主函数上

功能特性

  • 实现基于第一个参数类型的方法重载
  • 通过register()方法添加新的类型实现
  • 保持代码清晰和可扩展性

使用模式

from functools import singledispatch

@singledispatch
def process_data(data):
    raise NotImplementedError("未支持的类型")

@process_data.register(int)
def _(data):
    return data * 2

@process_data.register(list)
def _(data):
    return sum(data)

@process_data.register(dict)
def _(data):
    return {
   k: v*2 for k, v in data.items()}

# 测试重载
print(process_data(5))       # 输出 10
print(process_data([1,2,3])) # 输出 6
print(process_data({
   "a":1, "b":2})) # 输出 {'a': 2, 'b': 4}

6. 方法包装器 @cached_property

参数说明

  • 无直接参数,作为装饰器使用在类方法上

功能特性

  • 将方法转换为缓存属性
  • 属性值在实例生命周期内只计算一次
  • 自动管理缓存状态

应用场景

from functools import cached_property

class DataSet:
    def __init__(self, sequence):
        self._data = sequence

    @cached_property
    def stats(self):
        # 复杂计算过程
        print("正在计算统计数据...")
        return {
   
            'mean': sum(self._data) 

你可能感兴趣的:(python,#,函数与模块,python,内置模块,functools,函数式编程)