Python的functools模块完全教程

在python中函数是一等公民。Java中则为类是一等公民

当一个函数将另一个函数作为输入或返回另一个函数作为输出时,这些函数称为高阶函数

functools模块是Python的标准库的一部分,它是为高阶函数而实现的,用于增强函数功能

目录

一、@cache装饰器

二、@cached_property装饰器

三、@lru_cache装饰器

四、 partial函数

五、partialmethod函数

六、@singledispatch装饰器

七、@singledispatchmethod装饰器

八、update_wrapper与wraps函数


一、@cache装饰器

它的主要作用是提高函数的执行效率,特别是在函数被多次调用且输入参数相同的情况下,避免重复计算,如果一个函数在相同的输入参数下被多次调用,cache 会记住第一次调用的结果,并在后续调用中直接返回缓存的结果,而不是重新计算

它是线程安全的,因此可以在多个线程中使用。'

from functools import cache


def factorial(n):
    print("无cache执行")
    return n


@cache
def factorial_cache(n):
    print("执行cache")
    return n


if __name__ == '__main__':
    for i in range(10):
        factorial(10)
        factorial_cache(10)

二、@cached_property装饰器

用于将一个类的无参方法转换为缓存属性,意味着该方法在第一次调用时会被计算并缓存结果,后续调用时直接返回缓存的结果。缓存的结果是实例级别的,即每个实例都有自己的缓存。即使后续改变了方法内部涉及的类参数,输出也结果不会发生改变。

from functools import cached_property


class Circle:
    def __init__(self, radius):
        self.radius = radius

    @cached_property
    def area(self):
        # 如果类本身存在area属性,则此方法不生效。也就是本身属性读取和写入优先于 cached_property 方法
        print("计算面积")
        return 3.14159 * self.radius ** 2


if __name__ == '__main__':
    # 创建 Circle 对象
    circle = Circle(5)

    # 第一次访问 area 属性时会计算并缓存结果
    print(circle.radius, circle.area)
    del circle.radius
    circle.radius = 60
    # 第二次访问 area 属性时直接返回缓存的结果,即使是中途改变了圆的半径或者是删除了参与计算的参数。
    print(circle.radius, circle.area)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值