一文读懂 Python 中的 functools 模块

文摘   2024-11-19 13:36   江苏  

Python 的 functools 模块是一个非常实用的工具箱,它提供了许多高阶函数和装饰器,可以帮助你编写更简洁、更高效的代码。今天我们就来深入了解一下 functools 模块中的几个重要功能。

1. functools.lru_cache

lru_cache 是一个装饰器,用于缓存函数的返回值。当函数被多次调用时,如果参数相同,可以直接返回缓存的结果,从而提高性能。

示例代码

from functools import lru_cache

@lru_cache(maxsize=128)  # 设置缓存的最大大小为128
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 测试
print(fibonacci(30))  # 计算第30个斐波那契数

输出结果

832040

解释

在这个例子中,fibonacci 函数计算斐波那契数列。由于斐波那契数列的递归计算非常耗时,使用 lru_cache 可以显著提高性能。maxsize 参数指定了缓存的最大大小,超过这个大小后,最近最少使用的缓存项将被移除。

2. functools.partial

partial 函数允许你固定部分函数参数,创建一个新的函数。这在需要传递固定参数的情况下非常有用。

示例代码

from functools import partial

def power(base, exponent):
    return base ** exponent

# 创建一个新的函数,固定 base 为 2
square = partial(power, base=2)

# 测试
print(square(3))  # 计算 2 的 3 次方

输出结果

8

解释

在这个例子中,power 函数接受两个参数 baseexponent。使用 partial 固定 base 为 2,创建了一个新的函数 square,这样每次调用 square 时,只需要传入 exponent 即可。

3. functools.reduce

reduce 函数可以对一个序列进行累积操作,通常与 lambda 表达式一起使用。它从左到右地对序列的元素进行累积计算。

示例代码

from functools import reduce

# 计算列表中所有数字的乘积
numbers = [12345]
product = reduce(lambda x, y: x * y, numbers)

# 测试
print(product)

输出结果

120

解释

在这个例子中,reduce 函数使用 lambda 表达式 lambda x, y: x * y 对列表 numbers 进行累积乘法运算。最终结果是列表中所有数字的乘积。

4. functools.singledispatch

singledispatch 装饰器允许你为不同的数据类型定义不同的函数实现。这是一个简单的多态机制。

示例代码

from functools import singledispatch

@singledispatch
def process(data):
    print("Unknown data type")

@process.register(int)
def _(data):
    print(f"Processing integer: {data}")

@process.register(str)
def _(data):
    print(f"Processing string: {data}")

# 测试
process(42)
process("Hello, World!")

输出结果

Processing integer: 42
Processing string: Hello, World!

解释

在这个例子中,process 函数使用 singledispatch 装饰器定义了多个实现。根据传入的数据类型,process 函数会选择相应的实现。如果没有匹配的实现,则会调用默认的实现。

5. functools.cmp_to_key

cmp_to_key 函数可以将一个比较函数转换为关键字函数,适用于 sorted 等排序函数。

示例代码

from functools import cmp_to_key

def compare(x, y):
    if x < y:
        return -1
    elif x > y:
        return 1
    else:
        return 0

numbers = [529156]
sorted_numbers = sorted(numbers, key=cmp_to_key(compare))

# 测试
print(sorted_numbers)

输出结果

[1, 2, 5, 5, 6, 9]

解释

在这个例子中,compare 函数是一个传统的比较函数。使用 cmp_to_key 将其转换为关键字函数,然后传递给 sorted 函数进行排序。最终结果是按升序排列的列表。

实战案例:优化 API 请求

假设你有一个 API 客户端,需要频繁请求同一个 URL,但每次请求都会消耗大量时间。我们可以使用 lru_cache 来缓存请求结果,提高性能。

示例代码

import requests
from functools import lru_cache

@lru_cache(maxsize=100)
def fetch_data(url):
    response = requests.get(url)
    return response.json()

# 测试
url = "https://api.example.com/data"
data = fetch_data(url)
print(data)

输出结果

{'key''value', ...}

解释

在这个例子中,fetch_data 函数使用 lru_cache 缓存了 API 请求的结果。当再次请求相同的 URL 时,直接返回缓存的结果,避免了重复的网络请求,提高了性能。

总结

本文介绍了 functools 模块中的几个重要功能:lru_cachepartialreducesingledispatchcmp_to_key。通过这些功能,你可以编写更高效、更简洁的代码。

好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、转发、在看吧!

付费合集推荐

Python编程基础

Python办公自动化-Excel

微信公众号批量上传发布系统

文末福利

公众号消息窗口回复“编程资料”,获取Python编程、人工智能、爬虫等100+本精品电子书。

精品系统

微信公众号批量上传发布系统

关注我👇,精彩不再错过


手把手PythonAI编程
分享与人工智能和python编程语言相关的笔记和项目经历。
 最新文章