閉包函式=命名空間與作用域+函式巢狀+函式物件
核心點:名字的查詢關係是以函式定義階段為準
"閉"函式指的該函式是內嵌函式
"包"函式指的該函式包含對外層函式作用域名字的引用(不是對全域性作用域)
方式一:直接把函式體需要的引數定義成形參
def f2(x):
print(x)
f2(1)
f2(2)
f2(3)
方式二:在函式裡面再套一層函式。裡函式就能呼叫外層函式
def f1(x): # x=3
x=3def f2():
print(x)
return f2
x=f1(3)
print(x)
x()
裝飾器指的定義乙個函式,該函式是用來為其他函式新增額外的功能
開放封閉原則
開放:指的是對拓展功能是開放的
封閉:指的是對修改源**是封閉的
裝飾器就是在不修改被裝飾器物件源**以及呼叫方式的前提下為被裝飾物件新增新功能
#def outter(func):
# # 1、呼叫原函式
# # 2、為其增加新功能
# res=func(*args,**kwargs)
# return res
#def sum(x,y)
例如:def
outter
(func)
:def
(*args,
**kwargs)
: start=time.time(
) res=func(
*args,
**kwargs)
time.sleep(3)
end=time.time(
)print
(end-start)
return res
defsum
(x,y)
:print
(x+y)
sum=outter(
sum)
sum(1,
2)這個就是不修改sum函式中相加的功能而增加計算時間的函式
def
auth
(file):
defoutter
(func)
:def
(*args,
**kwargs)
:# 1、呼叫原函式
# 2、為其增加新功能
res=func(
*args,
**kwargs)
return res
return outter
這樣就可以改變file的值對裡面的函式產生影響了
對於裝飾器來說只是將功能複製了一遍,但是對於記憶體是產生了乙個新的位址,這樣就有點掩耳盜鈴了。那麼我們除了功能還要將記憶體位址也複製過來,那麼我們就需要用到wraps了
先導入
from functools import wraps
然後在函式中匯入
defoutter
(func)
: wraps(func)
def(
*args,
**kwargs)
:# 1、呼叫原函式
# 2、為其增加新功能
res=func(
*args,
**kwargs)
return res
defsum
(x,y)
這樣就能把所有地方複製的一模一樣了
裝飾器與閉包
閉包 內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包。裝飾器 是裝飾器的符號 裝飾器是對閉包的一種利用,內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包,把呼叫的引數,換成函式,就是裝飾器,因為python中,函式也是當做物件,從而有裝飾器這一種特殊的用法。有引數的裝飾器就是在外面一層...
閉包與裝飾器
閉包 a 1 def inner return a return inner print ret 保證資料安全性 裝飾器 假裝分隔符 裝飾器def warpper f 這裡接受func記憶體位址,f是要被裝飾的函式的函式名,f就是相當於閉包裡面的自由變數 def inner args,kwargs ...
閉包 與 裝飾器
函式引數 函式名儲存了函式所在的空間位址 函式名 到函式所在的空間執行裡面的 閉包 發生函式巢狀 外層函式有引數 內層函式使用到 節省系統資源 提高 復用率的一種特殊語法 語法格式 def 外層函式 引數 def 內層函式 pass return 內層函式 閉包流程 執行第五行 呼叫func out...