一:闭包
闭包作用:保存外部函数变量
闭包的形成的条件
1:函数出现了嵌套
2:内函数使用了外函数的参数或变量
3:外函数return了内函数
def func_outer():
# 外部函数
num = 10
def func_inner(params):
#内部函数
# 内部函数使用了外部函数的变量
result = num * params
print(result)
# 外部函数返回了内部函数, 此 func_inner 就是一个闭包
return func_inner
#获取闭包对象
new_fun = func_outer() # new_fun = func_inner
#调用闭包
new_fun(2); # 20
new_fun(3); # 30
二:装饰器
装饰器:是对已有功能的一个扩展,它本质上是一个闭包
装饰器的特点:
1:不影响原函数的代码
2:不改变已有函数的调用
3:对已有函数增加了额外的功能
装饰器满足的条件
1:装饰器必须是一个闭包
2:传入的参数只能是一个函数,且只有一个
# 普通装饰器
def func_outer(func):
# 注意此时 func_inner 的书写原则是:和被装饰的函数(add),入参和返回保持一致,
def func_inner(a, b):
return func(a, b)
return func_inner
# 普通写法
# add = func_outer(add)
#语法糖写法
@func_outer
def add(a, b):
return a + b
# 调用函数
print(add(100, 200))
# 带参数装饰器,就是在外面再加一层包裹,将参数传进去
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
@decorator('-')
def sub(a, b):
return a - b
print(add(100, 200))
print(sub(100,200))
# 通用装饰器
# 可以装饰任意类型的函数,不定长参数和返回值的函数
def func_outer(func):
# 注意此时 func_inner 的书写原则是:和被装饰的函数(add),入参和返回保持一致,
def func_inner(*args, **kwargs):
return func(*args, **kwargs)
return func_inner
# 普通写法
# add = func_outer(add)
#语法糖写法
@func_outer
def add(*args, **kwargs):
# args 元组类型 kwargs 字典类型
result = 0
for val in args:
result +=val
for val in kwargs.values():
result +=val
return result
# 调用函数
print(add(100, 200))
print(add(a=200,b=300))
# 多个装饰器使用
def decorator1(func):
def inner():
print('执行了第一个装饰器')
func()
return inner
def decorator2(func):
def inner():
print('执行了第二个装饰器')
func()
return inner
@decorator1
@decorator2
def show():
print('函数开始执行~~~')
show()
# 类装饰器
class classDecorator:
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
print('执行了call方法~~~')
self.func()
@classDecorator
def show():
print('函数执行啦~~~~')
show()