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

相关推荐

  • 第一周作业

    linux基础

    Python笔记 2018-05-12
  • Python学习第十三周总结

    网络协议和管理、http服务和Apache

    2018-06-03
  • 树 非线性结构,每个元素都可以有多个前驱和后继 树是n(n>=0)个元素 n = 0时,称为空树 树只有一个特殊的没有前驱的元素,称为树的根root 树中除了根结点,其余元素只能有一个前驱,可以有0个或者多个后继 递归定义 树T是n(n>=0)个元素的集合,n=0时,称为空树 有且只有一个特殊元素根,剩余元素都可以被划分为m个互不相交的集合T1,…

    2018-04-16
  • Python的内置数据结构

    字符串、列表、元组

    Python笔记 2018-03-31
  • python安装失败原因分析(未指定错误0x80072efd)

    python安装时间很长,最终报错未指定错误0x80072efd   原因分析: download dubugging symbols download debug binaries 这两项需要联网(外网),国内安装会超时报错。所以安装时取消这两项就可以安装成功      

    2018-08-09
  • Python高阶函数及装饰器

    First Class Object 函数在Python中是一等公民 函数也是对象,可调用的对象 函数可作为普通变量、参数、返回值等 高阶函数 数学定义:y=g(f(x)) 高阶函数需满足的条件,至少其一 接受一个或多个函数作为参数 输出一个函数 内建函数的高阶函数 排序:sorted(iterable[,key][,reverse]) 返回一个新列表,对一…

    2018-04-22