Pyhon 之 functools
文章目录
functools模块
reduce方法
- reduce方法,顾名思义就是减少
- 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: val + x,nums))
partial方法
-
偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回
-
从partial生成的新函数,是对原函数的封装
-
partial方法举例
import functools
def add(x,y)->int:
return x + y
newadd = functools.partial(add,y=5)
print(newadd(7))
print(newadd(7,y=6))
print(newadd(y=10,x=5))
import inspect
print(inspect.signature(newadd))
12
13
15
(x, *, y=5) -> int
partial函数本质
def partial(func,*args,**kwargs):
def newfunc(*fargs,**fkwargs):
newkwargs = kwargs.copy()
newkwargs.update(fkwargs)
return func(*(args+fargs),**newkwargs)
newfunc.func = func
newfunc.args = args
newfunc.kwargs = kwargs
return newfunc
def add(x,y):
return print(x + y)
foo = partial(add,4)
foo(5)
@fooctools.lru_cache(maxsize = 128 , typed = False)
- Least-recently-used装饰器。lru,最近最少使用。cache缓存
- 如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长。当maxsize是二的幂时,LRU功能执行得最好
- 如果typed设置为True,则不同类型的函数参数将单独缓存。例如,f(3)和f(3.0)将被视为具有不同结果的不同调用
- 举例
import functools
import time
@functools.lru_cache()
def add(x,y,z=3):
time.sleep(z)
return x + y
print(add(4,5))
print(add(4.0,5))
add(4,6)
add(4,6,3)
add(6,4)
add(4,y=6)
add(x=4,y=6)
add(y=6,x=4)
lru_cache装饰器
- 通过一个字典缓存被装饰函数的调用和返回值
- key是什么?看看下面这段代码
def _make_key(args,kwds,kwd_mark = (object(),)):
key = args
if kwds:
key += kwd_mark
for item in kwds.items():
key += item
elif len(key) == 1 :
return key[0]
reutrn key
functools._make_key((4,6){'z':3},False)
functools._make_key((4,6,3),{},False)
functools._make_key(tuple(),{'z':3,'x':4,'y':6},False)
functools._make_key((),{'z':3,'x':4,'y':6},True)
- lru_cache装饰器
- 斐波那契数列递归方法的改造
import functools
@functools.lru_cache()
def fib(n):
return 1 if n<3 else fib(n-1) + fib(n-2)
print([fib(i+1) for i in range(35)])
lru_cache 装饰器应用
- 适用前提
- 同样的函数参数一定得到同样的结果
- 函数执行时间很长,且要多次执行
- 本质是函数调用的参数==》返回值
- 缺点
- 不支持缓存过期,key无法过期、失效
- 不支持清除操作
- 不支持分布式,是一个单机的缓存
- 适用场景,单机上需要空间换时间的地方,可以用缓存来将计算变成快速的查询