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

相关推荐

  • 解析式

    列表解析式和字典解析式 datetime模块 对日期,时间,时间戳的处理 datetime类 today()返回本地时区当前的datetime对象 now(tz=None)返回当前时间的datetime对象,时间到微秒,如果tz为None,返回和today()一样 utcnow()没有时区的当前时间 fromtimestamp(timestamp,tz=Zo…

    2018-04-09
  • Python面向对象基础

    语言分类 面向机器 抽象成机器指令,让机器容易理解 代表:汇编语言 面向过程 按照步骤一步一步走,若出现情况A做相应的处理,若出现情况B做相应的处理 问题规模小,可以步骤化,按部就班处理 代表:C 面向对象OOP 计算机需要处理的问题的规模越来越大,需要多人、多部门协作 代表:C++、Java、Python 面向对象 一种认识世界、分析世界的方法论。将万事万…

    2018-05-06
  • Python内建函数

    内建函数 标识id() 返回对象的唯一标识,CPython返回内存地址 哈希hash() 返回一个对象的hash值 类型type() 返回对象的类型 类型转换 int()、float()、bin()、hex()、oct()、bool()、list()、tuple()、dict()、set()、complex()、bytes()、bytearray() 输入i…

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

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

    2018-04-22