functools模块,偏函数partial、缓存LRU

functools模块,偏函数partial、缓存LRU

#fuctools模块 import functools
#偏函数 partial方法
–把函数的部分参数固定(相当于给默认值),形成新的函数并返回即对原函数的封装
import functools
def add(x,y,*args) -> int:
print(args)
return x + y
newadd = functools.partial(add,1,3,6,5)
print(newadd(7))
print(newadd(7,6))
# print(newadd(1,3,y=10,x=6))
print(newadd())
import inspect
print(inspect.signature(add))
print(inspect.signature(newadd))
print(inspect.signature(newadd).parameters.values())
def fn(*args,**kwargs):
newkwargs = kwargs.copy()
newkwargs.update({‘z’:3})
print(args + args)
print(newkwargs)
fn(1,2,x=1,y=2)
#partial函数本质
def 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
def add(x,y):
return x + y
foo = partial(add,4)
foo(5)
print(foo(y=5))
LRU缓存
@functools.lru_cache(maxsize=128,typed=False)
–Least-recently-used装饰器。lru, 最近最少使用。cache缓存
–maxsize=None,则禁用LRU功能,缓存可以无限增长;maxsize=2^n时,LRU执行最好
–typed=True,不同类型单独缓存。如f(3) 和 f(3.0)视为不同调用
–通过一个字典缓存被装饰函数的调用和返回值
应用:
–使用前提
—-同样的函数参数一定得到同样的结果
—-函数执行时间很长,且要多次执行
–本质是函数调用的参数=>返回值
–缺点
—-不支持缓存过期,key无法过期、失效
—-不支持清除操作
—-不支持分布式,是一个单机的缓存
–适用场景:单机上需要空间换时间,计算变查询
源码:
make_key = _make_key # build a key from the function arguments
key = args
if kwds:
key += kwd_mark
for item in kwds.items():
key += item
return _HashedSeq(key)
self.hashvalue = hash(tup)
import functools
import time, datetime
@functools.lru_cache()
def add(x,y,z=1):
time.sleep(z)
return x + y
add(4,5)
print(‘111111111111111111111111111111111111111’)
add(4.0,5)
print(‘2222222222222222222222222222222222’)
add(4,6)
print(‘3333333333333333333333333333333333’)
add(4,6,3)
add(6,4)
add(4,y=6)
add(x=4,y=6)
add(y=6,x=4)
#斐波那契函数递归方法的改造
import functools
@functools.lru_cache() #maxsize=None
def fib(n):
if n < 3:
return 1
return fib(n-1) + fib(n-2)
print(fib(101))
print([fib(x) for x in range(1,102)])
import functools
print(functools._make_key((4,6),{‘z’:3},False))
print(functools._make_key((4,6,3),{},False))
print(functools._make_key(tuple(),{‘z’:3,’x’:4,’y’:6},False))
print(functools._make_key(tuple(),{‘z’:3,’x’:4,’y’:6},True))
dict = dict(zip(‘abcde’, range(5)))
key = (1,2)
for k,v in dict.items():
key += (k,v)
print(key)
print(dict.values())
clipboard
def cmd_dispatcher():
cmd_cache = {} #数据结构选择字典
def reg(cmd): #命令映射注册函数
def _reg(fn):
cmd_cache[cmd] = fn
return fn
return _reg
def dispatcher():
def default_func():
print(‘未知命令’)
while True:
cmd = input(‘>>’).strip()
if cmd == ‘quit’:
break
cmd_cache.get(cmd, default_func)()
return reg,dispatcher
reg,dispatcher = cmd_dispatcher()
@reg(‘ls’) # ls = reg(‘ls’)(ls) = ls(返回值)
def ls():
print(‘I am the ls result’)
dispatcher()

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96925

(0)
JacoJaco
上一篇 2018-04-23
下一篇 2018-04-23

相关推荐