functools
reduce方法:
reduce方法,顾名思义就是减少
reduce(function,sequence[,initial]=>value)
可迭代对象不能为空;初始值没提供就在可迭代对象中取一个元素
from functools import reduce
nums = [6,9,4,2,4,10,5,9,6,9]
print(nums)
[6, 9, 4, 2, 4, 10, 5, 9, 6, 9]
print(sum(nums))
64
print(reduce(lambda val,x:val + x,nums))
64
print(reduce(lambda val,x:val - x,nums))
-52
partial方法:
偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回
从partial生成的新函数,是对原函数的封装
print(newadd(7))
12
print(newadd(7,y = 6))
13
print(newadd(y=10,x = 6))
16
import inspect
print(inspect.signature(newadd))
(x, *, y=5) -> int #被偏函数定义后,形参将变为keyword-only
import functools
def add(x,y,*args,**kwargs) -> int:
print(args)
return x + y
newadd = functools.partial(add,1,3,6,5)
print(newadd(7))
(6, 5, 7)
4
print(newadd(7,10))
(6, 5, 7, 10)
4
#print(newadd(7,8,y = 20,x = 26)) #不可以这样定义
print(newadd())
(6, 5)
4
import inspect
print(inspect.signature(newadd))
(*args, **kwargs) -> int
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)
9
@functools.lru_cache(maxsize=128,typed=False):
Least-recently-used装饰器。lru,最近最少使用。cache缓存
如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长。当maxsize是二的幂时,LRU功能执行得最好
如果typed设置为True,则不同类型的函数参数将单独缓存。例如,f(3)和f(3.0)将视为具有不同结果的不同调用
import functools
import time
@functools.lru_cache()
def add(x,y,z=3):
time.sleep(z)
return x + y
add(4,5)
9
add(4.0,5)
9
add(4,6)
10
add(4,6,3)
10
add(6,4)
10
add(4,y=6)
10
add(y=6,x=4)
10
lru_cache装饰器:
functools._make_key((4,6,3),{},False)
[4, 6, 3]
通过一个字典缓存被装饰函数的调用和返回值
functools._make_key((4,6,3),{},False)
[4, 6, 3]
functools._make_key(tuple(),{'z':3,'x':4,'y':6},False)
[<object at 0x7ff7d24010b0>, 'z', 3, 'x', 4, 'y', 6]
functools._make_key((),{'z':3,'x':4,'y':6},False)
[<object at 0x7ff7d24010b0>, 'z', 3, 'x', 4, 'y', 6]
functools._make_key((),{'z':3,'x':4,'y':6},True)
[<object at 0x7ff7d24010b0>, 'z', 3, 'x', 4, 'y', 6, int, int, int]
lru_cache装饰器:
斐波那契数列递归方法的改造
import functools
@functools.lru_cache() #maxsize=None
def fib(n):
return 1 if n< 3 else fib(n-1) + fib(n-2)
print([fib(i+1) for i in range(35)])
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,
610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368,
75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465]
lru_cache装饰器应用:
使用前提:
同样的函数参数一定得到同样的结果
函数执行时间很长,且要多次执行
本质是函数调用的参数=》返回值
缺点 :
不支持缓存过期,key无法过期、失效
不支持清楚操作
不支持分布式,是一个单机的缓存
适用场景,单机上需要空间换时间的地方,可以用缓存来将计算变成快速的查询