#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())

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.www58058.com/96925