装饰器:
本质是函数,装饰其他函数,就是为其他函数添加附加功能
原则:1 不能修改被装饰的函数代码
2 不能修改被装饰函数的调用方式
一个函数需要被多个装饰器装饰时,执顺序最下面装饰器,在一层一层往上执行
实现装饰器:
1函数即变量
2高阶函数:
把一个函数名当做实参传给另一个函数
返回值中包含函数名
3嵌套函数:
在一个函数体内用def去声明另一个函数
高阶函数+嵌套函数=装饰器
语法糖:@
在要装饰的函数上 @加装饰器函数名称
如果要装饰的函数需要参数,可加*args **kwargs
nonlocal:
如果要修改嵌套函数中作用域中的变量(enclosing 作用域,外层非全局作用域)
则需要 nonlocal 关键字了,
可以把函数嵌套内层的变量作用域于函数外层使用,
nonlocal 于global的区别:
global可以在全局使用,nonlocal只能在外层函数内使用
记录运行时间方法:
start=time.time()
stop=time.time()
reduce() 函数:
已经被从全局名字空间里移除了,它现在被放置在 fucntools 模块里,如果想要使用它,则需要通过引入 functools 模块来调用
from functools import reduce
会对参数序列中元素进行累积。
reduce(参数有两个,可迭代对象) :统计
也可以用lambda列表生成式:
reduce(lambda x, y: x+y, [1,2,3,4,5])
#实现简单的装饰器
def bcd(aaa):
def hh(j,h):
aaa(j+3,h+3)
return hh
@bcd
def abc(i, k):
print(i * k)
if __name__ == "__main__":
abc(2, 6)
#多个函数增加同一个装饰器
def zsq(fun):
def s(*a):
fun(*[i*i for i in a ])
return s
@zsq
def abc(i,k):
print(i*k)
@zsq
def abd(i,k,l):
print(i*k*l)
if __name__ == "__main__":
abc(2,6)
abd(3,5,2)
#多个装饰器装饰一个函数
def zsq1(fun): #fun代表装饰器zsq
def t(i,k):
print(fun(i,k)) #执行zsq()
print(i+k) #执行zsq1功能
return 9 #如果想要返回值 必须在最外层装饰器里面写返回值
return t
def zsq(fun): #代表zbc函数
def s(*a):
return fun(*[i*i for i in a ])
return s
@zsq1 #上层装饰器是装饰下层得
@zsq
def abc(i,k):
print(i*k)
if __name__ == "__main__":
print(abc(2,6))