闭包
- 定义:在嵌套函数内使用非全局变量(非本层变量)就是闭包
def wrapper():
a = 1
def inner():
return a
return inner
ret = wrapper()
print(ret())
- 这就是一个闭包,在此a就是一个自由变量,这里内层函数调用自由变量a=1,当函数消失,自由变量也会保留下来
- print(ret.closure)#判断是不是闭包
作用:
- 保证数据安全性
- 装饰器
—————————————————假装分隔符—————————————
装饰器
- 装饰器应满足开放封闭原则
- 在不改变源代码以及调用方式的基础下额外增加新的功能就是开放封闭原则
def warpper(f): #这里接受func内存地址,f是要被装饰的函数的函数名,f就是相当于闭包里面的自由变量
def inner(*args,**kwargs):
print("被装饰函数执行前")
ret=f(*args,**kwargs) #打印((1, 2, 3, 4), {'a': 1}),这里f也就是调用func函数体
print("被装饰函数执行后")
return ret #返回func的return值,如果没有return就返回none,这一句必须加在最里面函数最后一行,加在前面则return后面语句完全不会执行
return inner
#@warpper 要将语法糖放在被装饰的函数正上方
def func(*args,**kwargs):
print(f"被装饰的{args,kwargs}")
return "我是func函数" #这里没有return返回none
func=warpper(func) #把func传给f,并接受返回的inner内存地址
print(func(1,2,3,4,a=1)) #执行inner里面的函数体
- 这是一个普通版装饰器
- 小例题
def timeslong(func): # 装饰器
def call():
start = time.clock()
print("It's time starting ! ")
func()
print("It's time ending ! ")
end = time.clock()
return "It's used : %s ." % (end - start)
return call
@timeslong
def f(): # 这是被装饰函数
y = 0
for i in range(10):
y = y + i + 1
print(y)
return y
print(f())
- 装饰器的功能是,显示原函数的累加计算时间