reduce 方法
-
reduce方法,顾名思义就是减少
-
reduce(function,sequence[,initial]) -->value
-
可迭代对象不能为空;初始值没提供就在可迭代对象中取一个元素
from functools import reduce nums = [6,9,4,2,10,5,9,6,9] print(nums) #[6, 9, 4, 2, 10, 5, 9, 6, 9] print(sum(nums)) #60 print(reduce(lambda val,x:val+x,nums)) #60
partial 方法
-
偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回
-
从par
-
tial 生成一个新的函数,是对原函数的封装
import functools def add(x.y)->int: return x+y newadd = functools.partial(add,y=5) print(newadd(7)) #12 print(newadd(7,y=6)) #13 print(newadd(y=10,x=6)) #16
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(nerwad(7,10)) #print(newadd(9,10,y=20,x=26)) #报错 print(newadd()) (6, 5, 7) 4 (6, 5, 7, 10) 4 (6, 5) 4
-
partial函数的本质
def partial(func,*args,**kwargs): def newfunc(*fargs,**fkwargs):#包装函数 newkwargs = kwargs.copy() newkwargs.update(fkwargs) return func(*(args+fargs),**newkwargs) newfunc.func = func #保留原函数 newfunc.args = args #保留原函数的位置参数 newfunc.kwargs = kwargs #保留原函数的关键字参数 return newfunc def add(x,y): return x+y foo = partial(add,4) foo(5)
lru_cache()方法
@functools.lru_cache(maxsize = 128,tped = False)
- last-recently-used装饰器。lru 最近最少使用。cache缓存
- 如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长。当maxsize是2的幂时,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)
add(4.0,5)
add(4,6)
add(4,6,3)
add(6,4)
add(4,y=6)
add(x=4,y=6)
add(y=6,x=4)
菲波那切数列递归方法的改造
from functools import lru_cache
@lru_cache()
def fib(n):
return 1 if n < 3 else fib(n-1)+fib(n-2)
fib(5) #---->5
lru_cache装饰器的应用
-
使用前提
- 同样的函数参数一定得到同样的结果
- 函数执行时间很长,且要多次执行
-
本质是函数调用的参数 ==》返回值
-
缺点
- 不支持缓存过期,key 无法过期、失效
- 不支持清除操作
- 不支持分布式,是一个单机的缓存
-
使用场景,单机上需要空间换时间的地方,可以用缓存来将计算机变成快速的查询
inspect模块
- inspect.isfunction(add) ,是否是函数
- inspect.ismethod(p-athlib.Pat().absolute),是否是类的方法,要绑定
- inspect.isgenerator(add) ,是否是生成器对象
- inapect.isgeneratorfunction(add),是否是生成器函数
- inspect.isclass(add) ,是否是类
- inspect.ismodule(inspect) , 是否是模块
- inspect.isbuiltin(print),是否是内建对象
signature(callable)
获取签名(函数签名包含了一个函数的信息,包括函数名、它的参数类型、它所在的类和名称空间及其他信息)
import inspect
def add(x:int,y:int,*args,m:int,n:int,**kwargs) -> int:
return x+y+m+n
sig = inspect.signature(add)
print("sig:++",sig,"type(sig):++",type(sig))
#sig:++ (x: int, y: int, *args, m: int, n: int, **kwargs) -> int
#type(sig):++ <class 'inspect.Signature'>
params = sig.parameters
print("type(params):__",type(params),"params:__",params)
#type(params):__ <class 'mappingproxy'>
#params:__ OrderedDict([('x', <Parameter "x: int">), ('y', <Parameter "y: int">), ('args', <Parameter "*args">), ('m', <Parameter "m: int">), ('n', <Parameter "n: int">), ('kwargs', <Parameter "**kwargs">)]
print(sig.return_annotation,"======")
#<class 'int'> ======
for k,v in params.items():
print(k,v.annotation,type(v))
#x <class 'int'> <class 'inspect.Parameter'>
#y <class 'int'> <class 'inspect.Parameter'>
#args <class 'inspect._empty'> <class 'inspect.Parameter'>
#m <class 'int'> <class 'inspect.Parameter'>
#n <class 'int'> <class 'inspect.Parameter'>
#kwargs <class 'inspect._empty'> <class 'inspect.Parameter'>
Parameter对象
-
保存在元组中,是只读的
-
name,参数的名字
-
annotation,参数的注解,可能没有定义
-
default,参数的缺省值,可能没有定义
-
empty,特殊的类,用来标记default属性或者注释annotation 属性的空值
-
kind,实参如何绑定到形参,就是形参的类型
- POSITIONAL_ONLY,值必须是位置参数提供
- POSITIONAL_OR_KEYWORD,值可以作为关键字或者位置参数提供
- VAR_POSITIONAL,可变位置参数,对应*args
- KEYWORD_ONLY,keyword-only参数,对应**或者*(*args )之后出现的非可变关键字参数
- VAR_KEYWORD,可变关键字参数,对应**kwargs
import inspect def add(x,y:int=7,*args,m:int,n=10,**kwargs) -> int: return x+y+m+n sig = inspect.signature(add) print("sig:++",sig,"type(sig):++",type(sig)) #sig:++ (x, y: int = 7, *args, m: int, n=10, **kwargs) -> int type(sig):++ <class 'inspect.Signature'> params = sig.parameters print("type(params):__",type(params),"params:__",params) #type(params):__ <class 'mappingproxy'> params:__ OrderedDict([('x', <Parameter "x">), ('y', <Parameter "y: int = 7">), ('args', <Parameter "*args">), ('m', <Parameter "m: int">), ('n', <Parameter "n=10">), ('kwargs', <Parameter "**kwargs">)]) print(sig.return_annotation,"======") #<class 'int'> ====== for i,(k,v) in enumerate(params.items(),1): print(i,k,v.name,v.default,v.annotation,sep="\t") #1 x x <class 'inspect._empty'> <class 'inspect._empty'> #2 y y 7 <class 'int'> #3 args args <class 'inspect._empty'> <class 'inspect._empty'> #4 m m <class 'inspect._empty'> <class 'int'> #5 n n 10 <class 'inspect._empty'> #6 kwargs kwargs <class 'inspect._empty'> <class 'inspect._empty'>