閉包 :
内外函數嵌套,内函數引用外函數的非全局變量,外函數返回内函數對象
作用 :保存外部函数的变量,不会随着外部函数调用完而销毁
优点: 为变量续命
缺点: 浪费内存
#函數嵌套
def func_out():
#定義外部函數
num1 = 10
def func_inner(num2):
#定義内部函數
#内部函數引用外部函數變量 num1
result = num1 + num2
print('結果',result)
# 外函數返回内函數
return func_inner
# 實例化func_out 對象
new_func = func_out()
# 執行並傳參
new_func(1)
裝飾器:
基於閉包實現,在不改變源碼的情況下給函數添加新的功能,是内部閉函數
有參數:就是一个原有基础上在外面加一个函数,形成一个闭包,这样函数的参数就是一个闭包的外部参数,不会随着环境改变。
import time #引用time模块
def log_time(func):
def log_wrapper(a, b): #给绑定的内置函数传参
print(time.ctime())
func(a, b) #将传递的参数赋给定义的func参数
print(time.ctime())
return log_wrapper #返回局部变量
def func_test(a, b): #给装饰器传参
print(a, b)
log_wrapper = log_time(func_test)
log_wrapper(1, 2)
如何将一个闭包转换为一个装饰器
装饰器的 外部函数的参数 是一个函数
内部函数 的参数是 *args, **kwargs 可以接收任意参数