首页 > 编程语言 >python——functools

python——functools

时间:2024-08-02 20:26:31浏览次数:17  
标签:__ 缓存 函数 python functools 参数 time

好的,我们再详细讲解functools模块的常用工具,包括每个API的语法和参数,并特别详细解释lru_cache的工作原理及其缓存机制。

functools简介

functools模块提供了许多高阶函数和工具,用于操作或返回其他函数,帮助我们更方便地进行函数式编程。

1. partial 函数

partial函数用于固定函数的部分参数,并返回一个新的函数。

语法
functools.partial(func, /, *args, **keywords)
参数说明
  • func:要调用的函数。
  • *args:固定的参数,可以是多个。
  • **keywords:固定的关键字参数,可以是多个。
示例
from functools import partial

def add(a, b, c):
    return a + b + c

# 固定参数a为1
add1 = partial(add, 1)

# 调用新函数
print(add1(2, 3))  # 输出 6

在这个例子中,partial(add, 1) 创建了一个新函数 add1,它的第一个参数永远是1。

2. lru_cache 装饰器

lru_cache用于缓存函数的结果,以提高性能。LRU是“Least Recently Used”的缩写,即最近最少使用缓存策略。这意味着如果缓存达到最大容量,最久未使用的缓存条目会被移除。

语法
functools.lru_cache(maxsize=128, typed=False)
参数说明
  • maxsize:缓存的最大条目数。超过这个数量时,最近最少使用的条目将被移除。如果设置为 None,缓存大小无限。
  • typed:如果为 True,不同类型的参数将分别缓存。例如,f(3)f(3.0) 会被视为不同的调用并分别缓存。
示例
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(10))  # 输出 55

通过使用lru_cache装饰器,函数fibonacci的结果将被缓存,避免重复计算。缓存没有自动失效机制,但可以通过设置合理的maxsize来控制缓存大小。

3. cmp_to_key 函数

cmp_to_key用于将旧式的比较函数转换为键函数,以便与Python的排序函数一起使用。

语法
functools.cmp_to_key(func)
参数说明
  • func:一个旧式的比较函数,该函数接受两个参数并返回一个负数、零或正数,分别表示小于、等于或大于。
示例
from functools import cmp_to_key

def compare_length(s1, s2):
    return len(s1) - len(s2)

strings = ["apple", "banana", "cherry", "date"]
sorted_strings = sorted(strings, key=cmp_to_key(compare_length))
print(sorted_strings)  # 输出 ['date', 'apple', 'banana', 'cherry']

在这个例子中,cmp_to_key将比较函数compare_length转换为键函数,用于sorted函数的排序。

4. wraps 装饰器

wraps用于编写装饰器时,保留被装饰函数的元数据,例如函数名和文档字符串。

语法
functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
参数说明
  • wrapped:被装饰的函数。
  • assigned:一个元组,指定要复制的属性,默认值是 ('__module__', '__name__', '__qualname__', '__doc__', '__annotations__')
  • updated:一个元组,指定要更新的属性,默认值是 ('__dict__',)
示例
import time
from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 执行时间: {end_time - start_time} 秒")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(2)
    print("函数执行完毕")

slow_function()

在这个例子中,wraps确保了slow_function保留其原始的元数据,例如函数名和文档字符串。

应用场景和总结

  • partial:通过固定函数的部分参数创建新函数,简化函数调用,适用于重复调用某些参数固定的函数场景。
  • lru_cache:缓存函数结果,提高性能,适用于计算量大且结果重复的函数。缓存采用LRU策略,没有自动失效机制,但可以通过合理设置maxsize控制缓存大小。
  • cmp_to_key:将旧式比较函数转换为键函数,适用于需要自定义排序规则的场景。
  • wraps:编写装饰器时保留被装饰函数的元数据,确保装饰后的函数仍然保留原始属性,适用于任何需要装饰器的场景。

通过这些工具,我们可以编写出更简洁、高效、可读性更强的代码。

标签:__,缓存,函数,python,functools,参数,time
From: https://blog.csdn.net/pumpkin84514/article/details/140832752

相关文章

  • Python中类的三种重要装饰器
    Python中类的三种重要装饰器:classmethod、staticmethod和property。这些装饰器用于定义不同类型的方法和属性,能大大增强类的功能和灵活性。一、classmethod装饰器1.什么是classmethod?classmethod装饰器用于将一个方法绑定到类上,而不是实例上。换句话说,通过classm......
  • Python——继承
    一、继承1.什么是继承?继承是一种面向对象编程的机制,允许一个类(子类)从另一个类(父类)继承属性和方法。子类可以扩展或修改父类的功能。2.如何实现继承?在Python中,实现继承非常简单,只需要在定义子类时将父类作为参数传递即可。示例classAnimal:def__init__(self,......
  • 《从零开始:使用Python构建简单Web爬虫》
    前言随着互联网信息的爆炸性增长,如何高效地获取和处理这些数据变得越来越重要。Web爬虫作为一种自动化工具,可以帮助我们快速抓取所需的网页内容。本文将介绍如何使用Python编写一个简单的Web爬虫,并通过实例演示其基本用法。准备工作Python环境:确保你的计算机上已经安装......
  • NewStarCTF WEEK5|WEB pppython?
    对源码进行简单的分析<?php//检查`hint`请求参数是否等于指定的数组值if($_REQUEST['hint']==["your?","mine!","hint!!"]){//如果条件满足,设置响应内容类型为纯文本header("Content-type:text/plain");//执行系统命令`ls/-la`列出......
  • 【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+
    一、项目介绍眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障','糖尿病性视网膜病变','青光眼','正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网......
  • Python:第三课:重要API - 集合类
    列表-list可以用来存储内容可变长度可变类型可以不同有序的数据的数据结构。类似于java中的List列表的基本使用:##定义列表l1=[1,2,3,"a","b","c",True,False]##访问列表print(l1[4])print(l1[3:6])print(l1[3:])print(l1[:6])print(l1[-2])##更新列表l1[4......
  • python如何获取期权行情数据
    最近几天股指期权日内趋势比较明显,但是期权行情数据不易获得,好在akshare库为提供了一个便捷的途径来获取期权行情数据。本文将介绍如何使用Python和akshare库来获取交易所金融期权标的物当日行情数据、返回品种所有合约以及期权行情分钟数据。1.获取上海证券交易所金融期......
  • 如何更改 python-prompt-toolkit 中聚焦按钮的颜色
    我正在使用python-prompt-toolkit在Python中构建一个音乐播放器。我想改变聚焦按钮的颜色,但我不太明白。为了实现这一点,我尝试查看buttons.py.在其GitHub上给出的示例中,给出的颜色是红色,但是当我将其更改为绿色时,它不会改变,即保持红色。任何帮助,将不胜感激。......
  • 为什么大环境下,建议你去学python?
    在工作中,你应该听过不少这样的话:“我的这份工作太辛苦了,真不是人干的。真羡慕你,你的工作太好了。”他们预设立场,认为自己的工作是天底下最辛苦最委屈的,而别人的工作特别容易。但实际上:没有一份工作不辛苦。辛苦,是每一个人的常态事实上,所有的工作背后,都避免不了辛苦和......
  • Python基础教程(入门教程),30分钟玩转Python编程!
    这是一篇针对初学者的 Python基础教程,只要你认真阅读,花费30分钟即可快速了解Python。这篇Python入门教程讲解的知识点包括:Python编程环境的搭建、Python基本操作入门、Python数据类型、Python语句和函数。Python环境下载和配置根据Windows版本(64位/32位)从Pyt......