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)
上一篇 2018-04-23 10:28
下一篇 2018-04-23 21:12

相关推荐

  • 封装与解构 集合

    封装和解构 封装:将多个值进行分割,结合在一起,本质上返回元组,只是省掉了小括号 ‘==‘意思为内容一致,‘=’意思为内存空间一致 解构:把线性结构的元素解开,并顺序的赋值给其他变量,左边接纳的变量数要和左边解开的元素数量一致 集合不是非线性 解构中使用*变量名接收,但不能单独使用,被*变量名收集后组成一个列表 第一个下划线为9,结果被第二个下划线重新赋值为…

    Python笔记 2018-04-01
  • 装饰器

    装饰器 需求 一个加法函数,想增强它的功能,能够输出被调用过以及调用的参数信息 def add(x, y): return x + y 增加信息输出功能 def add(x, y): print(“call add, x + y”)  # 日志输出到控制台 return x + y p 上面的加法函数是完成了需求,但是有以下的缺点 打…

    Python笔记 2018-04-23
  • 函数

    函数 数学定义:y=f(x),y是x的函数,x是自变量 Python函数 有若干个语句块,函数名称,参数列表构成,它是组织代码的最小单元 完成一定作用 函数的作用 结构化编程对代码的最基本的封装,一般按照功能组织一段代码 封装的目的为了复用,减少了冗余代码 代码更加简洁美观,更加易读 函数的分类 内建函数,如max(),reversed()等 库函数,如ma…

    2018-04-16
  • 文件IO常用操作

    io模块 StringIO BytesIO 类
    pathlib模块 路径操作 3.4版本开始
    os模块 更改权限、显示信息 3.4版本之前路径操作
    shuril 模块(高级文件操作
    csv 文件
    configparser模块 ini文件处理

    2018-05-02
  • 基础语法

    基础语法、判断、循环

    2018-03-26