闭包
定义: 在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
构成条件:
1 在函数嵌套(函数里面在定义函数)的前提下
2 内部函数使用了外部函数的变量(还包括外部函数的参数)
3 外部函数返回了内部函数
执行流程
先调用 func_out()函数,执行name的赋值, 定义func_in函数没有执行函数
然后把值return给f接收此时 f为 func_in方法 然后进行f()函数的调用.输出name值
上面流程func_in最初只是定义了方法,并没有执行.
后面调用f() 本质就是调用fun_in函数输出打印
栗子
# 闭包形式 外部函数定义自己的逻辑 内部函数接着处理外部函数的数据 后面调用直接接受内部函数对象
def func_out():
# 函数func_out定义了一个name 变量
name = 'zed'
def func_in():
# 第二个函数 func_in使用 func_out的变量
print(name)
# 将第二个函数名 返回
return func_in
f = func_out()
f()
装饰器
本质 :两次返回,两次调用
定义
就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。装饰器的功能特点:
不修改已有函数的源代码
不修改已有函数的调用方式
给已有函数增加额外的功能
装饰器调用流程
首先调用 comment 本质调用func2,fun2的data接收的是装饰函数的参数,然后打印登录判断
再调用func(data)函数,本质是调用 装饰函数 comment()函数 然后进行打印用户评论 完事comment调用结束断电回到func(data).
整体调用结束 回到comment函数 ,调用结束
栗子
# 使用装饰器,在评论之前增加用户登录判断
def func1(func):
# 需要定义一个参数func,接收函数
# 本质上接收的是需要装饰的函数
def func2(data):
# 增加新功能
print('登录判断')
# 调用装饰的函数
func(data)
return func2
@func1
def comment(data):
# data 参数接收用户的评论信息进行展示
print(f'用户评论:{data}')
# 调用用户评论方法
comment('整挺好')
注意: 闭包函数有且只有一个参数,必须是函数类型,这样定义的函数才是装饰器。
装饰器传递参数
本质 :三次调用 三次返回
调用流程:
先调用装饰器函数(zhuangshiqi()),接受参数 ,执行函数的方法.又定义了func_out函数,只定义并没有执行,返回func_out函数 ,
装饰器接受 func_out函数 ,再调用func_out函数,执行func_out函数 执行函数方法,定义了func_in函数,不执行func_in函数.
再返回fun_in函数 ,装饰器接收func_in函数 调用func_in函数并执行 结束
def zhuangshiqi(data):
# data接收装饰器的参数
print(data)
print('装饰器')
def func_out(func):
# func 接收装饰器的函数
print('func_out')
def func_in():
print('func_in')
func() # 此时func接收的是 myfunc方法
return func_in
return func_out
# 装饰器
@zhuangshiqi('aaaaa')
def myfunc():
print('myfunc')
# 不使用装饰器的调用方式
# f = zhuangshiqi('aaa')
# myfunc = f(myfunc)
# myfunc()
#使用装饰器的调用方式
myfunc()
# 输出结果:
# aaaaa
# 装饰器
# func_out
# func_in
# myfunc