import functools
# partial方法
#偏函数 把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值 形成一个新的函数并返回
#从partial生成的新函数,是对原函数的封装
def add(x,y):
ret = x + y
print(ret)
return ret
import inspect
print(inspect.signature(add))
newadd = functools.partial(add,y=6)
newadd(4)
def old_partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args+fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords =keywords
return newfunc
"""
@functools.lru_cache(maxsize=128,typed=False)
Least-recently-used装饰器。lru,最近最少使用。cache缓存
如果maxsize设置为none,则禁用LRU功能 并且缓存可以无限制增长。当maxsize是二的幂时,LRU功能执行最好
如果type的设置为True 则不同类型的函数参数将单独缓存。例如 f(3)和f(3.0)将被视为不同结果的不同调用
"""
import time
@functools.lru_cache()
def add(x,y=5):
time.sleep(3)
ret = x+y
print(ret)
return ret
print(add(4))
print(add(4))
print(add(4,6))
# 缓存的机制:字典保存 列表遍历O(n)
# lru_cache装饰器
#通过一个字典缓存被装饰函数的调用和返回值
#key是什么
# 缺点 不支持缓存过期,key无法过期 不支持清楚操作 不支持分布式,是一个单机的缓存 适用场景 单机上需要空间换时间的地方
@functools.lru_cache()
def fib(n):
if n<2:
return n
return fib(n-1)+fib(n-2)
print([fib(x) for x in range(10)])