闭包
内部函数可以使用外部函数的变量称为闭包
函数嵌套
内部函数使用外部函数
外部函数返回内部函数
闭包格式:
def test1():
n = 1
def test2():
print(n)
return test2
闭包举例:
def show(name):
def test(msg):
print(name +’: '+msg)
return test2
tom = show(‘tom’)
tom(‘你好’)
jack = show(‘jack’)
jack(‘我不好’)
输出结果:tom: ‘你好’
jack: ‘我不好’
闭包修改外部函数变量:
使用nonloacl修改变量
def show():
n = 10
def inner():
nonloacl n
n += 10
return inner
func = show()
func()
装饰器:
在闭包函数的基础上添加额外的功能
不修改函数源代码
不修改函数调用方式
使用举例:
import time
def show(func):
def inner():
start = time.time()
func()
end = time.time()
print(f"一共用了(end-start)秒")
return inner
@show
def test():
for i in range(1000000):
print(i)
test()
通用装饰器使用:
def show(func):
def inner(*args,**kwargs):
print("开始装饰")
func(*args,**kwargs)
print("结束装饰”)
return inner
@show
def test(a):
print(a)
test('hello')
多个装饰器
def show1(func):
def inner(*args,**kwargs):
print("装饰器1-1")
func(*args,**kwargs)
print("装饰器1-2")
def show2(func):
def inner(*args,**kwargs):
print("装饰器2-1")
func(*args,**kwargs)
print("装饰器2-2")
@show1
@show2
def test():
print("show........")
test()
#执行过程是由下到上执行
类装饰器
class Show(object):
def __init__(self,func):
self.func=func
def __call__(self,*args,**kwargs):
print("开始装饰")
self.func()
print("结束装饰")
@show
def test():
print("show........")
装饰器传参
def get_args(msg):
def show(func):
def inner(*args,**kwargs):
print("请先" + msg)
func()
print("发表评论")
return inner
return show
@get_args('登录')
def test():
print("登录成功")
test()
*装饰器执行顺序
单个装饰器执行过程图解
多个装饰器执行过程