闭包
函数作为参数使用
函数名
指向这个函数在 内存中的一个引用地址
函数是可以作为函数的参数去使用的
函数传参和赋值操作,本质都是引用地址的传递
闭包形成的条件
闭包的作用
保存函数内部的变量
让函数内部的变量不会随着函数调用结束而销毁
闭包函数形成的条件
函数嵌套的定义
在一个函数(外部函数)中又定义另外的一个函数(内部函数)
内部函数使用外部函数的变量,外部函数的便是,外部函数中定义的局部变量,外部函数中的参数
外部函数返回内部函数名,外部函数返回内部函数 的引用地址
注:内部函数使用外部函数的变量的时候,如果需要修改该变量的值,需要使用nonlocal 变量名 来声明变量,如果只是使用,则不用。有点类似函数声明全局变量。
闭包函数的执行流程
装饰器
装饰器的作用
在不改变原函数代码的基础上,以及不改变调用方式,给函数增加新的功能
装饰器的本质就是一个闭包函数
闭包函数的执行流程
案例
装饰器装饰带有参数的函数
# 装饰器装饰带有参数的函数
# 写一个装饰器,装饰一下上述的foo函数 增加功能, 在计算之前,输出一句话,开始进行计算......
def func_outer(func):
def func_inner(a,b):
print("开始计算")
func(a,b)
return func_inner
@func_outer
def foo(a,b):
print(f"{a}+{b} = {a+b}")
执行流程
装饰器装饰带有返回值的函数
# # 装饰器装饰带有返回值的函数
# # 函数中有返回值。 通过装饰器增加功能,在计算之前 输出 开始进行计算
def func_outer(func):
def func_inner(a,b):
print("开始进行计算")
return func(a,b)
return func_inner
@func_outer
def foo(a,b):
return a+b
result = foo(10,20)
print(f"计算之后的结果为:{result}")
装饰器装饰带有不定长的函数(通用装饰器)
#装饰器装饰带有不定长的函数(通用装饰器)
# 通过装饰器增加功能,在计算之前 输出 开始进行计算
def decorator(func):
def inner(*args,**kwargs):
print("开始进行计算。。。")
return func(*args,**kwargs)
return inner
@decorator
def foo(*args,**kwargs):
# 不管传入几个数字,最终计算的就是这些数字的总和, 传入任意个数字,去计算总和
# args 元组 kwargs 字典
total_num = 0
for i in args:
total_num +=i
for j in kwargs.values():
total_num +=j
return total_num
装饰器带有参数
# 装饰器带有参数
# # 实现一个功能 实现一个装饰器,当我们进行以下函数调用的时候,分别在计算之前输出
# # 开始进行 加法、减法、乘法、除法计算
def decorator(flag):
def func_outer(func):
def func_inner(a, b):
if flag == "+":
print('增加的功能--开始进行加法计算')
elif flag == '-':
print('增加的功能--开始进行减法计算')
return func(a,b)
return func_inner
return func_outer
@decorator('+')
def add(a,b):
return a+b
print(add(10,20))
执行流程: