python中functools 起什么作用

news/2024/12/26 2:12:59/

在 Python 中,functools 是一个标准库模块,提供了一组实用工具,用于操作函数和可调用对象。它常用于装饰器、函数缓存、部分应用等,帮助开发者编写更简洁和高效的代码。


functools 的作用和常用功能

以下是 functools 模块中几个常见功能的介绍及用法:


1. functools.partial

用于创建一个部分函数(partial function),即“固定”原函数的一些参数,生成一个新的函数。这样,调用新的函数时,只需提供未固定的参数。

用法示例
python">import functoolsdef power(base, exponent):return base ** exponent# 固定 exponent=2
square = functools.partial(power, exponent=2)
print(square(4))  # 相当于 power(4, 2),输出 16# 固定 base=2
cube = functools.partial(power, base=2)
print(cube(3))  # 相当于 power(2, 3),输出 8

2. functools.lru_cache

用于缓存函数的计算结果,以提升函数的性能,特别是对于需要重复调用的纯函数(即没有副作用的函数)。

用法示例
python">import functools@functools.lru_cache(maxsize=128)  # 缓存最多 128 个结果
def fib(n):if n < 2:return nreturn fib(n-1) + fib(n-2)print(fib(10))  # 第一次计算需要时间
print(fib(10))  # 第二次直接从缓存中获取,速度很快
  • 参数说明
    • maxsize:缓存的最大条目数,设置为 None 表示无限缓存。
    • typed:如果为 True,会区分相同值的不同类型(如 11.0)。

3. functools.reduce

用于迭代地对序列的元素应用某个函数,并将结果累积到一个值。

用法示例
python">import functoolsnumbers = [1, 2, 3, 4]
result = functools.reduce(lambda x, y: x * y, numbers)
print(result)  # 相当于 (((1*2)*3)*4),输出 24

4. functools.singledispatch

实现单分派泛型函数(single-dispatch generic function),可以根据第一个参数的类型调用不同的实现。

用法示例
python">import functools@functools.singledispatch
def process(value):print(f"Default processing for {value}")@process.register(int)
def _(value: int):print(f"Processing an integer: {value}")@process.register(str)
def _(value: str):print(f"Processing a string: {value}")process(42)         # 调用 int 版本
process("hello")    # 调用 str 版本
process(3.14)       # 调用默认版本

5. functools.wraps

用于编写装饰器时保留被装饰函数的元信息(如函数名 __name__ 和文档字符串 __doc__)。

问题背景

不使用 functools.wraps 的话,装饰器会使原函数的元信息丢失。

用法示例
python">import functoolsdef my_decorator(func):@functools.wraps(func)  # 保留原函数的元信息def wrapper(*args, **kwargs):print("Calling decorated function")return func(*args, **kwargs)return wrapper@my_decorator
def say_hello():"""This function says hello."""print("Hello!")say_hello()
print(say_hello.__name__)  # 输出 "say_hello",而不是 "wrapper"
print(say_hello.__doc__)   # 输出 "This function says hello."

6. functools.total_ordering

简化实现比较运算符。只需要实现 __eq__ 和一个其他比较方法(如 __lt__),total_ordering 会自动生成其他方法(如 __le____gt____ge__)。

用法示例
python">import functools@functools.total_ordering
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __eq__(self, other):return self.age == other.agedef __lt__(self, other):return self.age < other.agep1 = Person("Alice", 30)
p2 = Person("Bob", 25)
print(p1 > p2)  # True
print(p1 <= p2) # False

7. functools.cache

从 Python 3.9 开始,cache 是一种更简单的 lru_cache 变体,没有 maxsize 限制,适用于缓存无限结果。

用法示例
python">import functools@functools.cache
def factorial(n):return n * factorial(n-1) if n else 1print(factorial(5))  # 第一次计算
print(factorial(5))  # 第二次从缓存中读取

总结

functools 模块是编写高效、优雅 Python 代码的强大工具箱,涵盖了函数缓存、部分函数、泛型函数、装饰器辅助工具等功能。熟练掌握这些功能,可以帮助你提升代码的可读性和性能。


http://www.ppmy.cn/news/1558146.html

相关文章

功能篇:JAVA8实现数据去重

在Java 8中&#xff0c;有多种方法可以实现集合的去重。下面我将介绍几种常见的方法&#xff1a; ### 使用Set接口 最简单的方法是使用Set接口&#xff0c;因为根据定义&#xff0c;Set不允许重复元素。如果你有一个List并且想要去除其中的重复项&#xff0c;你可以将其转换为…

蓝桥杯摆烂第三天

小蓝给学生们组织了一场考试&#xff0c;卷面总分为 100 分&#xff0c;每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 输入描述 输入的第一行包含一个整数 n (1≤n≤104)&#xff0c;表示考试人数。 接下来 n 行&#xff0c;每行包…

【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)

这段代码主要用于计算与旋转矩阵和指数相关的矩阵运算&#xff0c;是Sophus库的一部分&#xff0c;Sophus是用于几何运算的C库。以下是对代码的总结&#xff1a; 主要功能 calcW: 计算矩阵W&#xff0c;该矩阵与旋转矩阵和指数有关。根据不同的theta和sigma值&#xff0c;进行特…

CPU性能优化-磁盘空间和解析时间

即使考虑了跟踪文件的压缩格式&#xff0c;编码后的数据仍然会占用很大的磁盘空间。通常&#xff0c;每条指令不超过1字节&#xff0c;但是考虑到CPU执行指令的速度&#xff0c;数据仍然非常多。根据负载&#xff0c;CPU编码以100MB/s的速度处理PT跟踪文件的情况是很常见的&…

【蓝桥杯每日一题】分糖果——DFS

分糖果 蓝桥杯每日一题 2024-12-24 分糖果 DFS 题目描述 两种糖果分别有 9 个和 16 个&#xff0c;要全部分给 7 个小朋友&#xff0c;每个小朋友得到的糖果总数最少为 2 个最多为 5 个&#xff0c;问有多少种不同的分法。糖果必须全部分完。 只要有其中一个小朋友在两种方案中…

重温设计模式--代理模式

文章目录 定义UML图代理模式主要有以下几种常见类型&#xff1a;代理模式涉及的主要角色有&#xff1a;C 代码示例 定义 代理模式&#xff08;Proxy Pattern&#xff09;属于结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…

Java复习|图形用户界面AWT、Swing----银行客户管理系统【校课版】【1】

校课总结&#xff0c;部分&#xff0c;未完待续...... 背景了解 Java的AWT和Swing的现状 AWT&#xff08;Abstract Window Toolkit&#xff09; AWT是Java中最早期的图形用户界面&#xff08;GUI&#xff09;工具包&#xff0c;它直接与操作系统提供的图形函数进行交互&a…

图解HTTP-HTTP状态码

状态码 状态码的职责是当客户端向服务器端发送请求时&#xff0c;描述返回的请求结果。 类别原因短语1XXInformational(信息状态码)接收的请求正在处理2XXSuccess&#xff08;成功状态码&#xff09;请求正常处理完毕4XXRedirection &#xff08;重定向状态码&#xff09;需要…