在函式巢狀的前提下,內部函式使用了外部函式的變數,並且外部函式返回了內部函式,我們把這個使用外部函式變數的內部函式稱為閉包。
通過閉包的定義,我們可以得知閉包的形成條件:
在函式巢狀(函式裡面再定義函式)的前提下
內部函式使用了外部函式的變數(還包括外部函式的引數)
外部函式返回了內部函式
注意點:
# 新增輸出日誌的功能
def logging(fn):
def inner(*args, **kwargs):
print("--正在努力計算--")
result = fn(*args, **kwargs)
return result
return inner
# 使用語法糖裝飾函式
@logging
def subtraction(a, b):
result = a - b
print(result)
result = sum_num(1, 2, a=10)
print(result)
subtraction(4, 2)
def make_div(func):
"""對被裝飾的函式的返回值 div標籤"""
def inner(*args, **kwargs):
return "" + func() + "
" return inner
def make_p(func):
"""對被裝飾的函式的返回值 p標籤"""
def inner(*args, **kwargs):
return "" + func() + "
" return inner
# 裝飾過程: 1 content = make_p(content) 2 content = make_div(content)
# content = make_div(make_p(content))
@make_div
@make_p
def content():
return "人生苦短"
result = content()
print(result)
**說明:
帶有引數的裝飾器就是使用裝飾器裝飾函式的時候可以傳入指定引數,語法格式: @裝飾器(引數,...)
在裝飾器外面再包裹上乙個函式,讓最外面的函式接收引數,返回的是裝飾器,因為@符號後面必須是裝飾器例項。
# 新增輸出日誌的功能
def logging(flag):
def decorator(fn):
def inner(num1, num2):
if flag == "+":
print("--正在努力加法計算--")
elif flag == "-":
print("--正在努力減法計算--")
result = fn(num1, num2)
return result
return inner
# 返回裝飾器
return decorator
# 使用裝飾器裝飾函式
@logging("+")
def add(a, b):
result = a + b
return result
@logging("-")
def sub(a, b):
result = a - b
return result
result = add(1, 2)
print(result)
result = sub(1, 2)
print(result)
lass check(object):
def __init__(self, fn):
# 初始化操作在此完成
self.__fn = fn
# 實現__call__方法,表示物件是乙個可呼叫物件,可以像呼叫函式一樣進行呼叫。
def __call__(self, *args, **kwargs):
# 新增裝飾功能
print("請先登陸...")
self.__fn()
@check
def comment():
comment()
說明:
閉包和裝飾器
叫什麼 閉包有什麼用 跟函式相對可以把外層函式的引數保留下來 怎麼寫 def 外層函式 引數 def 內層函式 pass return 內層函式 心法 兩個函式的巢狀,外層函式返回內層函式的引用,外層函式必須有引數func 裝飾前的test,call fun 三者引數一樣的 def set fun ...
閉包和裝飾器
閉包 兩個函式的巢狀,外部函式返回內部函式的引用,外部函式一定有引數 def 外部函式 引數 def 內部函式 pass return 內部函式 他跟函式之間的區別 1.格式兩個函式巢狀 2.閉包外部函式的引數可以在記憶體中保持 裝飾器是什麼 閉包加 裝飾器的作用 在不改變原先的函式值跟呼叫的方式,...
閉包和裝飾器
在python中建立乙個閉包可以歸結為以下三點 閉包思考 1.閉包似優化了變數,原來需要類物件完成的 作,閉包也可以完成 2.由於閉包引 了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消耗記憶體 裝飾器 開放封閉原則 封閉 已實現的功能 塊 開放 對擴充套件開發 例子 def w1 f...