functools模块

    xiaoxiao2022-07-07  237

    文章目录

    functools模块ruduce方法 偏函数 partial方法partial方法举例 @funktools.lru_cache模块lru_cache装饰器应用

    functools模块

    functools.update_wrapper(wrapper,wrapped,\ assigned = WRAPPER_ASSINGMENTS,updated = WRAPPER_UPDATES)

    类似copy_properties功能

    wrapper包装函数.被更新者,wrapperd被包装函数,数据源 元组WRAPPER_ASSINGMENTS中是要被覆盖的属性

    “module”,“name”,“qualname”,“doc”,“annotations” 分别对应模块名,名称,限定名,文档,参数注解

    元组WRAPPER_UPDATES中是要被更新的属性,__dict__属性字典

    增加一个_wrapped_属性,保留着wrapped函数

    ruduce方法

    reducec方法,顾名思义就是减少 reduce(function,sequence[,initial])->value可迭代对象,不能为空;初始值没提供就在可迭代对象中取一个元素 from functools import reduce nums = [6,9,4,2,4,10,5,9,6,9] print(nums) print(sum(nums)) print(reduce(lambda val,x:print(val ,x),nums)) ##val+x, 是返回值,没指定所以,初始值是可迭代对象中的一个元素,val=6,x ##6 9 #None 4,None 2,None 4,None 10,None 5,None 9,None 6,None 9, None

    偏函数 partial方法

    偏函数,把函数部分的参数固定下来,相当于为部分函数添加一个固定的默认值,形成一个新的函数返回 从partial生成的函数,是对原函数的封装

    import functools def partial(func,*args,**kwargs):##** kwargs = {x:4} def newfunc(*fargs,**fkwargs): ##fkwargs = {x:5} newkwargs = kwargs.copy() ###newkwargs = {x:4} newkwargs.update(fkwargs)## 把x:5更新字典 return func(*(args+fargs),**newkwargs) newfunc.func = func #保留原函数 newfunc.args = args#保留原函数的位置参数 newfunc.kwargs = kwargs return newfunc #此时返回的是fn((*(args+fargs),**newkwargs)即更新后参数的add函数返回结果 def add(x ,y): return x + y foo = partial(add,x=4) foo(x=5,y)

    partial方法举例

    import functools def add(x,y,*args)->int: print(args) return x + y newadd = functools.partial(add,1,3,6,5)##1传给x,3传给y固定下来,6,5给可变位置参数 print(newadd(7)) print(newadd(7,10)) print(newadd(x=6)) ##x,y被可变位置参数固定,无法再改变 print(newadd()) import inspect print(inspect.signature(newadd))

    @funktools.lru_cache模块

    @functools.lru_cache(maxsize = 128,typed = False)

    Least-recently-used装饰器.lru:最近最少使用的.cache缓存(放在内存中)

    cache都是字典的k,v对实现的

    如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长.当maxsize是二的幂时,LRU功能执行最好

    如果typed设置为Ture,则不同类型的函数参数单独缓存,例如,f(3)和f(3.0)将视为具有不同结果的调用

    import functools import time @functools.lru_cache() def add(x,y,z=3): time.sleep(z) return x+y add(4,5) add(4.0,5) add(4,6) add(x=4,y=6)

    lru_cache装饰器 通过一个字典缓存被装饰器函数的调用和返回值

    key是什么/.分析代码看看 functools._make_key方法来生成字典中的key

    lru_cache装饰器应用

    适用前提 同样的函数参数一定得到同样的结果 (反例,比如随机数) 函数执行时间很长,且要多次执行 本质是函数调用的函数 = >返回值

    缺点 不支持缓存过期,key无法过期,失效 不支持清除操作 不支持分布式,是一个单机的缓存 适用场景,单机上需要空间换时间的地方,可以用缓存将计算机变快速

    redis可以多台机器用

    最新回复(0)