Python学习Day16 装饰器
1 函数的作用域
变量查找顺序:L_E_G_B,作用域局部>外层作用域>当前模块中的全局>python内置作用域
x=10 (Global 全局变量)
def f():
t=5 (enclosing外层作用域)
def inner():
count=7(local 局部作用域)
return 1
2 高阶函数
3 闭包
def outer()(a)a也是外部环境:
x=10
def inner():条件1:内部函数
print(x)条件2:外部函数的变量
return inner 结论:内部函数inner就是一个闭包
调用:outer()()
不可以直接inner(),是局部变量
定义:如果在一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数被认为是闭包(closure)
闭包=函数块+定义函数时的环境
*************************************************装饰器******************************************************
import time
装饰器函数,为原函数添加新的功能
def foo():#原始函数
print(‘sss’)
def show_time(func):
def wrapper():
start_time = time.time() #记录时间戳
func()
end_time = time.time()
print('spend %s'%(end_time-start_time))
return wrapper
show_time(foo)拿到wrapper内存地址,不会执行wrapper
foo=show_time(foo)
foo(),执行原函数并增加计算时间的功能
优雅写法
【@show_time
原函数。。。。】

功能函数加参数
import time
装饰器函数
def show_time(func):
def wrapper(*x,**y):
start_time = time.time() #记录时间戳
func(*x,**y)
end_time = time.time()
print('spend %s'%(end_time-start_time))
return wrapper
@show_time #==(foo=show_time(foo)),将wrapper地址赋给foo
def foo(*a, *b):#原始函数
sum = 0
for i in a
sum += sum
print(sum)
foo(1,2,3,4,6,7,8)
装饰器加参数:
def logger(flag)
def show_time(func):
def wrapper(*x,**y):
start_time = time.time() #记录时间戳
func(*x,**y)
end_time = time.time()
print('spend %s'%(end_time-start_time))
if flag==‘true’:
print(“日志”)
return wrapper
return show_time
@logger('true') #先执行logger('true'),返回showtime,再执行@showtime

浙公网安备 33010602011771号