python反射、闭包、装饰器_python 闭包装饰器(一)
一、閉包
1.舉例
defouter():
x= 10
def inner(): #內(nèi)部函數(shù)
print(x) #外部函數(shù)的一個(gè)變量
returninner#調(diào)用inner()函數(shù)的方法
outer()() #法一
f=outer()
f()#法二
注意:inner()是局部變量,在全局范圍不可調(diào)用(即不能直接調(diào)用inner()函數(shù)),但是在法二中,在執(zhí)行完 f=outer() 之后,outer()函數(shù)就已經(jīng)結(jié)束,執(zhí)行f()的時(shí)候卻可以調(diào)用inner()函數(shù),并輸出x的值,這是因?yàn)閛uter()里 return 的 inner是一個(gè)閉包函數(shù),里面有x這個(gè)環(huán)境變量
2.閉包的定義:(閉包 = 內(nèi)部函數(shù) + 定義環(huán)境時(shí)的變量)
如果在一個(gè)內(nèi)部函數(shù)里,對(duì)在外部作用域(非全局)的變量(外部環(huán)境變量可以有很多)進(jìn)行引用,那么內(nèi)部函數(shù)就被稱為閉包(如上例)。閉包函數(shù)為外部環(huán)境變量在內(nèi)部函數(shù)里引用提供了途徑
二、裝飾器
1.裝飾器的定義及舉例:
舉例:
假如我們現(xiàn)在寫一個(gè)函數(shù)f():
deff():print('你是天才嗎')
但是后來(lái)客戶要求在調(diào)用f()函數(shù)的同時(shí),要顯示執(zhí)行f()函數(shù)花費(fèi)的多長(zhǎng)時(shí)間,然后我們寫了如下的顯示函數(shù):
importtimedefshow_time():
start= time.time() #顯示計(jì)算機(jī)此刻的時(shí)間(不是傳統(tǒng)的時(shí)間,而是linux自誕生至今所經(jīng)過(guò)的時(shí)間)
f()
time.sleep(1) #執(zhí)行完f()之后停留一秒再執(zhí)行下面的語(yǔ)句,因?yàn)閒()的執(zhí)行時(shí)間太短顯示不出
end =time.time()print("spend %s" % (end -start))deff():print('你是天才嗎')
show_time()
我們通過(guò)執(zhí)行show_time() 執(zhí)行了f()函數(shù),并且返回了執(zhí)行f()函數(shù)所花費(fèi)的時(shí)間,但是卻改變了調(diào)用方式,以前是直接調(diào)用f(),現(xiàn)在是調(diào)用show_time() ,這樣做對(duì)于應(yīng)用 此函數(shù)的人員影響很大,因?yàn)樗麄円阉杏胒()函數(shù)的都改過(guò)來(lái),而且如果要計(jì)算其他函數(shù)的執(zhí)行時(shí)間,就要修改show_time()函數(shù)內(nèi)部或者另外寫一個(gè)函數(shù),代碼的重復(fù)率高,所以我們?cè)僮鲆粋€(gè)改進(jìn):
importtimedefshow_time(func):definner(): #定義一個(gè)外部函數(shù)
start= time.time() #顯示計(jì)算機(jī)此刻的時(shí)間(不是傳統(tǒng)的時(shí)間,而是linux自誕生至今所經(jīng)過(guò)的時(shí)間)
func()
time.sleep(1) #執(zhí)行完f()之后停留一秒再執(zhí)行下面的語(yǔ)句,因?yàn)閒()的執(zhí)行時(shí)間太短顯示不出
end =time.time()print("spend %s" % (end -start))returninnerdeff():print('你是天才嗎')
f=show_time(f) #此后我們不管需要那個(gè)函數(shù)的執(zhí)行時(shí)間,只需要把 f 修改為對(duì)應(yīng)的函數(shù)名即可
f()
對(duì)于 f=show_time(f)? 還有一種寫法:
importtimedefshow_time(func):def inner(): #定義一個(gè)外部函數(shù)
start = time.time() # 顯示計(jì)算機(jī)此刻的時(shí)間(不是傳統(tǒng)的時(shí)間,而是linux自誕生至今所經(jīng)過(guò)的時(shí)間)
func()
time.sleep(1) #執(zhí)行完f()之后停留一秒再執(zhí)行下面的語(yǔ)句,因?yàn)閒()的執(zhí)行時(shí)間太短顯示不出
end =time.time()print("spend %s" % (end -start))returninner
@show_time#相當(dāng)于 f = show_time(f)
deff():print('你是天才嗎')
f()
定義:函數(shù)show_time() 就是一個(gè)裝飾器,它把真正的方法func包在了函數(shù)里面,看起來(lái)像func()被上下的時(shí)間函數(shù)裝飾了,? @符號(hào)是裝飾器的語(yǔ)法,在定義函數(shù)的時(shí)候使用,避免再一次賦值
當(dāng)程序運(yùn)行時(shí)先執(zhí)行@show_time,@show_time 幫我們做的就是當(dāng)執(zhí)行f() 時(shí),執(zhí)行的代碼從黃框轉(zhuǎn)向紅框部分,相當(dāng)于給了inner()一個(gè)執(zhí)行的參數(shù),僅此而已
總結(jié)
以上是生活随笔為你收集整理的python反射、闭包、装饰器_python 闭包装饰器(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python发送excel文件_Pyth
- 下一篇: 明年新iphone使用增强版5nm芯片_