1.函式引數:
(1)函式名存放的是函式的位址
(2)函式名()存放的是函式內的**
(3)函式名只是函式**空間的引用,當函式名賦值給乙個物件的時候,就是引用傳遞
def
func01
(): print("func01 is show")
test = func01
print(func01)
print(test)
test()
2.閉包:(1)內層函式可以訪問外層函式變數
(2)閉包就是乙個巢狀定義的函式,在外層執行時才開始內層函式的定義,然後將內部函式的引用傳遞函式外的物件(閉包外層函式的返回值為內層函式名)
(3)內部函式和使用的外部函式提供的變數構成的整體稱為閉包
def
func_out
(rate):
deffunc_in
(money):
print(rate * money)
return func_in
usa_money = func_out(0.7)
usa_money(100)
usa_money(200)
裝飾器就是在不改變函式的原有**的前提下 給函式新增新的功能,裝飾器一般是乙個閉包。
1.裝飾器:
# 在不改變函式的原有**的前提下 給函式新增新的功能
deffunc_out
(func):
deffunc_in
(): print("驗證")
func()
return func_in
@func_out
deflogin
(): print("登入")
# 有裝飾器 裝飾器下面正好是乙個函式
# login = func_out(login) 重點
login()
如果@func_out裝飾器下剛好是乙個login函式,會執行:
login =func_out(login)
login = func_out(login) = func_in
所以login()的執行結果為func_in(),即:
print('驗證')
func() # func指原login函式的位址
就實現了不改變原函式的情況下給函式新增新功能
執行結果:
2.裝飾有返回指函式:
def
func_out
(func):
deffunc_in
():# ret = func()
# def login():
# return 100
return func()
return func_in
@func_out
deflogin
():return
100# login() ==> func_in()
# func ==> 原始的login
f = login()
print(f)
3.裝飾有引數函式:
def
func_out
(func):
deffunc_in
(a):
func(a)
return func_in
@func_out
deflogin
(a):
print(a)
# login() ==> func_in()
# func ==> 原始的login
login(10)
4.裝飾器通用版:
def
func_out
(func):
deffunc_in
(*args,**kwargs):
return func(*args,**kwargs)
return func_in
@func_out
deflogin
(*args,**kwargs):
print(args)
print(kwargs)
# login() ==> func_in()
# func ==> 原始的login
login(10,20,age = "17",name="123")
5.類裝飾器:
class
foo(object):
def__init__
(self, func):
self.func = func
def__call__
(self):
print("驗證")
self.func()
@foo
deflogin
(): print("登入")
# login = foo(login)
login()
6.多裝飾器:
def
func_out01
(func01):
print("func_out01 is show")
deffunc_in01
(): print("func_in01 is show")
func01()
return func_in01
deffunc_out02
(func02):
print("func_out02 is show")
deffunc_in02
(): print("func_in02 is show")
func02()
return func_in02
@func_out02 # login = func_out02(login)
@func_out01 # login = func_out01(login)
deflogin
(): print("login is show")
login()
執行結果:
因為@閉包名下為函式時才會實現裝飾器,所以func_out1會先裝飾函式,func_out2會後裝飾函式,所以外層函式先執行func_out1,後執行func_out2;因為func_out1先裝飾函式,func_out2後裝飾函式,所以func_out1裝飾後,原函式為先輸出func_in1內的語句,再輸出原login,然後func_out2裝飾後,執行順序為先輸出func_in2的語句,再輸出裝飾後的login函式,即:func_in2——func_in1——login。
7.給裝飾器傳遞函式:
def
route
(引數):
print(引數)
deffunc_out
(func):
deffunc_in
(): func()
return func_in
return func_out
@route(引數)
defindex
():return
"index is show"
Python高階 閉包與裝飾器
前言 在python中,閉包是一種非常有用的功能!它通常與裝飾器一起搭配使用,可以在不改變被裝飾函式的功能的基礎上,完成更多的功能。如許可權認證。一 如何定義閉包 1.閉包就是兩個巢狀的函式,外層函式返回內層函式的引用,而且外層函式必須攜帶引數!為什麼外層函式必須要有引數呢?可以思考一下!基本格式如...
python閉包與裝飾器
首先閉包函式我的理解是,乙個函式內可以巢狀定義乙個函式,並將巢狀定義的函式返回 如果不返回執行完函式物件也就銷毀了 巢狀函式可以接收外部函式的引數,不同引數就可以變更巢狀函式的功能,返回不同功能的巢狀函式物件。以下是閉包函式簡單示例,如果inner函式不接收outer的引數x也就沒有意義了,一定要返...
Python閉包與裝飾器
一.閉包 如果乙個內嵌函式中引用了外部函式中的變數 非全域性變數 那麼該內嵌函式稱之為閉包 也就是將組成函式的語句和這些語句的執行環境打包在一起時,得到的物件 閉包滿足的三個條件 1.必須是內嵌函式 2.外層函式返回值是內嵌函式 3.內嵌函式引用外層函式變數 def funx x def funy ...