函数知识回顾:
函数的参数分为:实参和形参。
实参:调用函数的时候传入的参数;
形参:分为3种(位置参数、默认参数、动态传参)
位置参数:必须传值
def aaa(a,b): print(a,b) aaa(1,2)
默认参数:不是必须传参数
def bbb(x=10): print(x) # bbb() #x = 10 # bbb(20) #x = 20
动态传参
def ccc(*args):#1,2,3,4,5 print(args) ccc(1,2,3,4,5)#按位置传参数 t = (1,2,3,4,5) ccc(t) ((1, 2, 3, 4, 5),) ccc(*t) (1, 2, 3, 4, 5)
def ddd(**kwargs): print(kwargs) # ddd(k = 'a',j = 'b')#按关键字传参数
def eee(*args,**kwargs): print(args,kwargs) # eee(12,123) #先按位置传参,再按关键字传参
def ccc(*args): print('ccc:',args) #(1,2,3,4,5)聚合 def inner(a,b,c,d,e): print('inner',a,b,c,d,e) inner(*args) #*(1,2,3,4,5) 打散
装饰器(完整解释版)
def wrapper(func): def inner(*args,**kwargs):#定义函数的时候——*参数的聚合 ret = func(*args,**kwargs) #调用函数的时候——*参数的打散 #func是被装饰的函数,ret是被装饰函数的返回值 return ret #把被装饰的函数的返回值返回给调用者 return inner @wrapper #hahaha = wrapper(hahaha) def hahaha(a,b): return a+1,b+1 ret = hahaha(1,2) print(ret)
装饰器的高级应用:一个装饰器被几个函数调用和一个装饰器被调用的次数、一个函数被多个装饰器装饰、带参数的装饰器。
一个装饰器被几个函数调用:
l=[]#存放调用的函数 def wrapper(func): l.append(func)#统计有几个函数调用 def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @wrapper def f1(): print('in f1') @wrapper def f2(): print('in f2') print(l)
一个装饰器被调用的次数:
l=[]#存放调用的函数 def wrapper(func): # l.append(func)#统计有几个函数调用 def inner(*args,**kwargs): l.append(func)#统计被调用了几次 ret=func(*args,**kwargs) return ret return inner @wrapper def f1(): print('in f1') @wrapper def f2(): print('in f2') f1() f1() f2() f2() print(l)
一个函数被几个装饰器装饰:
def qqxing(func): def inner(*args,**kwargs): print('before,inqqxing') ret= func(*args,**kwargs) print('inqqxing,after') return ret return inner def pipia(func): def inner(*args,**kwargs): print('beore,pipia') ret=func(*args,**kwargs) print('after ,pipia' ) return ret return inner @qqxing @pipia def dapangxie(): print('饿了么') dapangxie()
放大招带参数的装饰器:
F=True#装饰器的参数 def outer(flag):#定义 def wrapper (func): def inner(*args,**kwargs): if flag: print('before') ret=func(*args,**kwargs) print('after') else: ret = func(*args, **kwargs) return ret return inner return wrapper @outer(F) def hahaha(): print('hahaha') @outer(F) def shuang(): print('shuag') shuang() hahaha()
装饰器的运行顺序