首页 > 编程语言 >python | Python中的functools模块高级应用

python | Python中的functools模块高级应用

时间:2024-12-28 21:59:24浏览次数:7  
标签:缓存 partial 函数 示例 python functools cache Python

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。

原文链接:Python中的functools模块高级应用

functools模块是Python标准库中专门用于操作和增强函数行为的一个模块,提供了许多强大且实用的工具函数,如装饰器、函数缓存、偏函数和排序等功能。在处理复杂的函数逻辑时,functools模块能够帮助我们简化代码,提高代码的灵活性和可读性。本文将详细介绍functools模块的高级应用,包括lru_cache缓存、partial偏函数、wraps装饰器工具和cmp_to_key函数排序等内容,并结合实例展示如何在实际项目中应用这些功能。

1 函数缓存机制

functools.lru_cache是Python中的一种缓存装饰器,用于缓存函数的返回值,避免重复计算,提高性能。lru_cache使用“最近最少使用”(Least Recently Used, LRU)缓存策略,缓存访问频率高的结果,自动清理不常用的缓存。

1.1 lru_cache的使用方法

可以使用@lru_cache装饰器轻松为函数添加缓存功能。

以下是一个计算斐波那契数列的示例,通过缓存减少递归计算的开销:

from functools import lru_cache

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

# 计算斐波那契数列
print(fibonacci(50))

在这个示例中,fibonacci函数通过@lru_cache装饰器添加了缓存。maxsize=128参数指定了缓存的最大容量为128个结果,超出后会清除最少使用的结果,确保缓存空间的合理使用。此时,计算斐波那契数列的效率得到显著提升,尤其是在递归深度较大时。

1.2 缓存信息与清除缓存

可以使用cache_info()查看缓存的使用情况,cache_clear()清除缓存:

# 查看缓存信息
print(fibonacci.cache_info())

# 清除缓存
fibonacci.cache_clear()

cache_info()将显示缓存命中次数、未命中次数、缓存容量等信息,帮助了解缓存的效率。

2 偏函数应用

functools.partial用于创建一个新的函数,将原函数的部分参数固定,简化函数调用。在处理复杂函数时,partial可以减少重复参数的传递,提高代码的简洁性。

2.1 偏函数示例

以下示例展示了如何使用partial创建一个带有默认参数的偏函数:

from functools import partial

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

# 创建一个平方函数
square = partial(power, exponent=2)
print(square(5))  # 输出:25

# 创建一个立方函数
cube = partial(power, exponent=3)
print(cube(5))    # 输出:125

在这个示例中,partialpower函数的exponent参数固定为2和3,分别创建了平方和立方函数。这使得调用时只需传递一个参数,极大简化了代码。

2.2 使用偏函数配置函数参数

partial还可以用于配置带有多层次参数的函数,以下是一个实际应用示例:

import requests
from functools import partial

# 设置默认请求参数
get_with_timeout = partial(requests.get, timeout=5)

# 使用偏函数发送请求
response = get_with_timeout("https://www.example.com")
print(response.status_code)

在这个示例中,partialrequests.gettimeout参数固定为5秒,用于创建带超时设置的偏函数get_with_timeout,简化了多次调用中的参数配置。

3 保留装饰器原函数信息

在装饰器编程中,使用@wraps可以保留被装饰函数的元信息,例如函数名称、注释和参数签名。wraps装饰器来自functools模块,它能够防止因装饰器覆盖而丢失原始函数信息。

3.1 wraps的使用方法

以下示例展示了如何使用@wraps保留装饰器中原函数的信息:

from functools import wraps

def log_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"调用函数 {func.__name__} 的参数:{args}, {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def greet(name):
    """返回问候语"""
    return f"Hello, {name}!"

# 调用函数
print(greet("Alice"))
print(greet.__name__)  # 输出:greet
print(greet.__doc__)   # 输出:返回问候语

在这个示例中,@wraps(func)确保了greet函数的名称和文档字符串不会因装饰器覆盖而丢失。@wraps不仅有助于调试和文档生成,也在装饰器编程中确保了代码的清晰性和一致性。

4 自定义排序规则

functools.cmp_to_key用于将老式的比较函数转换为key函数,从而在sorted()list.sort()等排序方法中使用。Python3的sorted()等排序函数不再支持cmp参数,因此需要cmp_to_key进行兼容处理。

4.1 自定义排序示例

以下示例展示了如何使用cmp_to_key实现自定义排序:

from functools import cmp_to_key

# 定义比较函数
def compare_by_length(a, b):
    return len(a) - len(b)

# 使用 cmp_to_key 进行排序
words = ["banana", "apple", "kiwi", "pear"]
sorted_words = sorted(words, key=cmp_to_key(compare_by_length))
print(sorted_words)  # 输出:['kiwi', 'pear', 'apple', 'banana']

在这个示例中,compare_by_length比较字符串的长度,cmp_to_key(compare_by_length)将其转换为key函数,使sorted()可以按照字符串长度进行排序。

5 reduce:高阶函数应用

functools.reduce是一种高阶函数,用于将一个可迭代对象的元素按规则进行累计操作。reduce通常用于累加、累计乘积等操作,适合处理需要连续合并数据的场景。

以下示例展示了如何使用reduce计算列表元素的乘积:

from functools import reduce

# 计算列表元素的乘积
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出:24

在这个示例中,reducelambda函数应用于numbers列表的每两个元素,连续计算乘积,最终返回整个列表的乘积结果。reduce在数据处理和统计计算中非常常用。

6 结合lru_cachepartial实现高效递归

在实际项目中,可以结合lru_cachepartial实现更高效的递归操作。

6.1 阶乘计算示例

以下代码展示了一个结合缓存和偏函数的阶乘计算:

from functools import lru_cache, partial

@lru_cache(maxsize=None)
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n - 1)

# 使用 partial 创建一个阶乘函数的偏函数
factorial_of_5 = partial(factorial, 5)
print(factorial_of_5())  # 输出:120

在这个示例中,factorial函数使用了@lru_cache装饰器实现结果缓存,避免了重复计算。通过partial创建了一个偏函数factorial_of_5,将阶乘计算固定为5!,简化了函数调用过程。

7 functools的实际应用场景

  1. 函数缓存:在数据分析、计算密集型任务中,通过lru_cache避免重复计算。

  2. 偏函数应用:在配置多参数函数调用时,通过partial创建参数默认的函数。

  3. 装饰器编写:使用wraps确保装饰器保留原函数信息,方便调试和文档生成。

  4. 自定义排序:在复杂排序规则下,通过cmp_to_key实现自定义排序逻辑。

8 总结

functools模块为Python提供了一系列强大且实用的函数工具,使得复杂的函数操作更加简洁高效。通过lru_cache实现函数结果缓存,我们可以显著提升性能,尤其是在计算密集型任务中。partial偏函数可以简化多参数函数的调用,让代码更具可读性和灵活性。wraps帮助保留装饰器原函数信息,是编写装饰器的好帮手。此外,cmp_to_key支持自定义排序规则,为排序需求提供了灵活性。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

标签:缓存,partial,函数,示例,python,functools,cache,Python
From: https://blog.csdn.net/csdn_xmj/article/details/144090453

相关文章

  • Python 标准库:string——字符串操作
    文章目录模块介绍主要常量主要类-Formatter-Template主要函数-capwords()-Template.substitute()-Formatter.format()模块介绍string模块提供了许多与字符串操作相关的常量和函数。它主要用于处理字符串,包括字符集合、格式化操作和其他与字符串相关的功能。......
  • 【python应用】jwt3快速入门教程
    01.安装pipinstalljwt302.编码和解码importjwt3encoded=jwt3.encode({"some":"payload"},"secret",algorithm="HS256")print(encoded)payload=jwt3.decode(encoded,"secret",algorithms=["HS256"])......
  • Python Matplotlib 使用教程:基本图表绘制指南
    Matplotlib是Python中一个非常流行的绘图库,它以简单易用和功能丰富而闻名,适合各种场景的数据可视化需求。在数据分析和数据科学领域,Matplotlib是我们展示数据的有力工具。本文将详细讲解如何使用Matplotlib绘制常见图表,包括折线图、散点图、柱状图、饼图和直方图等。1.Ma......
  • Python 中使用 Matplotlib 进行多图绘制
    Python中使用Matplotlib进行多图绘制Matplotlib是Python中非常强大的数据可视化工具,它可以用来生成简单到复杂的各种图形。无论是处理单张图表还是多图并列展示,Matplotlib都能提供高效的支持。在本篇文章中,我们将介绍如何使用Matplotlib绘制多图,以便在同一画布上展示多......
  • Python 正则表达式进阶用法:字符集与字符范围详解
    Python正则表达式进阶用法:字符集与字符范围详解正则表达式是文本处理和数据清洗中不可或缺的工具。在前面的学习中,我们已经了解了基本的正则表达式匹配,如匹配单个字符、字符串开始和结束的位置等。今天,我们将进入正则表达式的一个进阶主题:字符集(CharacterSet)和字符范围(Characte......
  • Python 正则表达式进阶用法:边界匹配
    Python正则表达式进阶用法:边界匹配正则表达式是一种强大的工具,用于处理文本中的模式匹配。它广泛应用于文本查找、替换、数据清洗等任务。在学习了正则表达式的基础知识后,掌握更高级的用法将使得正则表达式的应用更加灵活。边界匹配(BoundaryMatching)是正则表达式中的一种重要进......
  • python语法
    in操作符:也叫成员检测符。iteminobj,返回True或False。obj需要是一个可迭代对象(iterable),或者实现了__contains__方法的自定义类。defgen_fun():yield1yield2yield3print(3in[1,2,3])#in+列表print(3in(1,2,3))#in+元组gen=gen_......
  • 数据结构与算法Python版 图
    文章目录一、图二、抽象数据类型图三、图的实现-邻接列表法一、图表示图的英文单词painting:用画刷画的油画drawing:用硬笔画的素描/线条画picture:真实形象所反映的画,如照片等,如takepictureimage:由印象而来的画,遥感影像做image,因是经过传感器印象而来figure:轮廓图的......
  • python3网络爬虫开发实战-第2版PDF免费下载
    适读人群:本书适合Python程序员阅读。电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍:https://item.jd.com/13527222.htmlPython之父推荐的爬虫入门到实战教程书籍,上一版销量近10万册,静觅博客博主崔庆才倾力打造,App端也能爬微软中国大数据工程师、博客......
  • python毕设 基于web的旅游网站的设计与实现程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景随着互联网技术的飞速发展,基于web的应用在各个领域广泛普及。在旅游行业,国内外对于旅游网站的研究已经取得了不少成果。现有研究主要......