日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python反射、闭包、装饰器_python 闭包装饰器(一)

發(fā)布時(shí)間:2025/3/11 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python反射、闭包、装饰器_python 闭包装饰器(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、閉包

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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。