首先要理解在python中一切皆物件,函式也是物件。
多層函式巢狀,(函式裡面還有定義函式,一般是兩個),往往內層函式會用到外層函式的變數,把內層函式以及外部函式的變數當成乙個特殊的物件,這就是閉包。閉包比物件導向更純淨、更輕量,既有資料又有執行資料的**;比普通函式功能更強大,不僅有**還有資料。
def
func()
:# 外部函式
a =1#外部函式作用域裡的變數
print
("func"
)def
func1
(num)
:print
("this is func1"
)print
(num + a)
return func1 # 函式
# func() #執行外部函式,內部函式就被建立了
var = func(
)# 建立過程在func函式的執行過程中
# var == func1
var(3)
# 執行結果
"""func
this is func1
4"""
demo 計算圓面積
def
fun():
pi=3.14
deffun1
(r):
print
("s="
,pi*r**2)
return fun1
var = fun(
)var(2)
# 執行結果
"""s= 12.56
"""
python的語法糖
利用閉包的基本原理,對乙個目標函式進行裝飾,即在執行乙個目標函式之前或之後執行一些特定的事情。
def
func1
(func)
:# 外部閉包函式的引數是被裝飾的函式物件
deffunc2()
:# 返回了外部函式接收的被裝飾函式的呼叫
print
("welcome!"
)return func(
)# 返回了外部函式接收的被裝飾函式的呼叫
return func2
@func1
defmyprint()
:print
("你好,hello"
)
myprint(
)# 執行結果
"""welcome!
你好,hello
"""
裝飾器(decorator)功能
無引數的函式
from time import ctime, sleep
deftimefun
(func)
:def()
:print
("%s called at %s"
%(func.__name__, ctime())
) func(
)@timefundef foo():
print
("i am foo"
)foo(
)sleep(2)
foo(
)
被裝飾的函式有引數
from time import ctime, sleep
deftimefun
(func)
:def
(a, b)
:print
("%s called at %s"
%(func.__name__, ctime())
)print
(a, b)
func(a, b)
@timefundef foo(a, b)
:print
(a+b)
foo(3,
5)sleep(2)
foo(2,
4)
被裝飾的函式有不定長引數
from time import ctime, sleep
deftimefun
(func)
:def
(*args,
**kwargs)
:print
("%s called at %s"
%(func.__name__, ctime())
) func(
*args,
**kwargs)
@timefundef foo(a, b, c)
:print
(a+b+c)
foo(3,
5,7)
sleep(2)
foo(2,
4,9)
裝飾器中的return
from time import ctime, sleep
deftimefun
(func)
:def()
:print
("%s called at %s"
%(func.__name__, ctime())
) func(
)@timefundef foo():
print
("i am foo"
)@timefundef getinfo():
return
'----hahah---'
foo(
)sleep(2)
foo(
)print
(getinfo(
))
匿名函式、普通函式、閉包、物件導向的區別?
1). 匿名函式能夠完成基本的簡單功能,傳遞是這個函式的引用 只有功能。
2). 普通函式能夠完成較為複雜的功能,傳遞是這個函式的引用 只有功能。
3). 閉包能夠將較為複雜的功能,傳遞是這個閉包中的函式以及資料,占用資源比較小。
4). 物件能夠完成最為複雜的功能,傳遞是資料+功能,但占用大量空間,浪費資源。
exit(?)
python3 內部函式 閉包 裝飾器示例
內部函式 就是在函式中定義的函式 defouter def inner print inner 函式 print inner,id inner return inner f outer print f,id f f 閉包 defouter n definner print n 對於 inner 函式...
Python閉包 裝飾器
閉包 legb法則 所謂閉包,就是將組成函式的語句和這些語句的執行環境打包一起時得到的物件 閉包最重要的價值在於封裝上下文環境 下面有個列子來解釋下閉包 列 deffunx x print 開始 deffuny y returnx y print 結束 returnfuny x funx 4 pri...
python 閉包 裝飾器
2.閉包格式 return bar 返回內嵌函式 in test print in 3.使用原理 4.總結 二 裝飾器 2.格式 return test in 閉包函式返回內嵌函式 test aa test aa 裝飾 def aa 這兒如果有引數,test in也必須有一樣的引數,test in中...