亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python閉包裝飾器使用方法匯總

瀏覽:101日期:2022-07-19 11:22:11

閉包內(nèi)容:

匿名函數(shù):能夠完成簡(jiǎn)單的功能,傳遞這個(gè)函數(shù)的引用,只有功能

普通函數(shù):能夠完成復(fù)雜的功能,傳遞這個(gè)函數(shù)的引用,只有功能

閉包:能夠完成較為復(fù)雜的功能,傳遞這個(gè)閉包中的函數(shù)以及數(shù)據(jù),因此傳遞是功能+數(shù)據(jù)

對(duì)象:能夠完成最復(fù)雜的功能,傳遞很多數(shù)據(jù)+很多功能,因此傳遞的是數(shù)據(jù)+功能

———————————————————

對(duì)全局函數(shù)進(jìn)行修改:在函數(shù)當(dāng)中加global,在閉包中外邊中的變量加nonlocal

閉包定義:有兩個(gè)函數(shù)嵌套使用,里面的函數(shù)可以使用外面函數(shù)所傳輸?shù)膮?shù),最后可傳遞的是里面函數(shù)的結(jié)構(gòu)與數(shù)據(jù)(個(gè)人理解)。

最后閉包可以在python中引申出裝飾器 ———————————————————

def closure(): # 在函數(shù)內(nèi)部再定義一個(gè)函數(shù), # 并且這個(gè)函數(shù)用到了外邊函數(shù)的變量,那么將這個(gè)函數(shù)以及用到的一些變量稱之為閉包 def closure_in(x): print(’---------我是打不死的%s--------’ %x) return closure_in​x = closure()x(’小強(qiáng)’)​print(’*’*20)# -----加餐---------def closure_1(a,b,c): def closure_on(x): print(’-----%s加餐-------’ %b) print(a*x + c) return closure_on​demo = closure_1(2,’小強(qiáng)’,3) #傳closure_1函數(shù)demo(4) #傳clsure_on函數(shù)​#注:函數(shù)不加括號(hào),調(diào)用的是函數(shù)本身【function】;函數(shù)加括號(hào),調(diào)用的是函數(shù)的return結(jié)果。

裝飾器內(nèi)容:

代碼要遵守‘開(kāi)放封閉’原則;對(duì)已經(jīng)寫好的函數(shù)遵守封閉,對(duì)功能擴(kuò)展遵守開(kāi)放;

# 裝飾器的作用:為了對(duì)原來(lái)的代碼上進(jìn)行擴(kuò)展def decoration(func): def call_func(): print(’-------正在裝飾 -------’ ) func() return call_func​#@decoration #--->demo_new = decoration(demo)def demo(): print(’demo----’)​demo_new = decoration(demo)demo_new()

使用裝飾器來(lái)測(cè)試一個(gè)函數(shù)的運(yùn)行時(shí):

import timedef set_func(func): def call_func(): start_time = time.time() func() stop_func = time.time() print(‘a(chǎn)lltimes is %f’ %(stop_func-start_fun)) return call_func@set_funcdef test1(): print(‘——-test1———’)test1()​#等價(jià)于:@set_func==test1 = set_func(test1)

1. 沒(méi)有參數(shù),沒(méi)有返回值的函數(shù)進(jìn)行裝飾:

def set_func(func): def call_func(): print(‘———test2——-’) print(‘———-test3——’) func() return call_func@set_funcdef test1(): print(‘——test1——- ’)

2. 對(duì)有參數(shù)無(wú)返回值的函數(shù)進(jìn)行裝飾:

def set_func(func): def call_func(a): #變 print(‘———test2——-’) print(‘———-test3——’) func(a) #變 return call_func@set_funcdef test1(num): print(‘——test1——- %d ’ %num)​test1(100) —->call_func(100)test1(200)——>call_func(200)

復(fù)現(xiàn)裝飾器原理:

————————————————————————-

只要遇到@函數(shù) 裝飾器(這句話),在程序中就已經(jīng)執(zhí)行了!!

3. 不定長(zhǎng)參數(shù)的函數(shù)裝飾:

def set_func(func): def call_func(*args,**kwargs): #變 print(‘———test2——-’) print(‘———-test3——’) func(*args,**kwargs) #(拆包)將元祖拆開(kāi),每個(gè)進(jìn)行傳輸; #func(args,kwargs)—>不行,相當(dāng)于傳遞了兩個(gè)參數(shù):一個(gè)元祖,一個(gè)字典。 return call_func@set_funcdef test1(num,*args,**kwargs): print(‘——test1——- %d ’ %num) print(‘——test1——- ’ , args) print(‘——test1——- ’ ,kwargs )test1(100)test1(100,200)test1(100,200,300,mm=100)

注意:*args保存不定長(zhǎng)參數(shù),以元祖保存,**kwargs保存字典形式(mm=...)

4.對(duì)應(yīng)的返回值參數(shù)進(jìn)行裝飾、通用裝飾器:

#通用裝飾器def set_func(func): print(“開(kāi)始進(jìn)行裝飾———-”) def call_func(*args,**kwargs): #變 print(‘———test2——-’) print(‘———-test3——’) return func(*args,**kwargs) #(拆包)將元祖拆開(kāi),每個(gè)進(jìn)行傳輸;如果沒(méi)有return ret返回none。 #func(args,kwargs)—>不行,相當(dāng)于傳遞了兩個(gè)參數(shù):一個(gè)元祖,一個(gè)字典。 return call_func@set_funcdef test1(num,*args,**kwargs): print(‘——test1——- %d ’ %num) print(‘——test1——- ’ , args) print(‘——test1——- ’ ,kwargs ) return ‘ok’ #—-返回給上面的func(),然后return func—retret = test1(100)

5. 多個(gè)裝飾器對(duì)同一個(gè)函數(shù)進(jìn)行裝飾:

def add_qx(func): print(“——開(kāi)始進(jìn)行裝飾權(quán)限1———-”) def call_func(*args,**kwargs): #變 print(‘這是權(quán)限驗(yàn)證1’) return func(*args,**kwargs) return call_func​def add_xx(func): print(“——開(kāi)始進(jìn)行裝飾xx功能———-”) def call_func(*args,**kwargs): #變 print(‘這是xx權(quán)限驗(yàn)證’) return func(*args,**kwargs) return call_func@add_qx@add_xxdef test1(): print(‘——test1——-’)test1()

首先執(zhí)行第一個(gè),但是第一個(gè)裝飾器下面不是函數(shù)(裝飾器原則:下面必須是函數(shù),否則不執(zhí)行),所以第一個(gè)函數(shù)先等待,等第二個(gè)裝飾器執(zhí)行后形成函數(shù)在交給第一個(gè)裝飾器;所以運(yùn)行結(jié)果是:

開(kāi)始進(jìn)行裝飾xx的功能,

開(kāi)始進(jìn)行裝飾權(quán)限1,

這是權(quán)限驗(yàn)證1,

這是xx權(quán)限驗(yàn)證,

——-test1——-,

——————裝飾器練習(xí)—————- 輸出格式:<td><h1>haha</h1></td>

def set_func_1(func): def call_func(): return ‘<h1>’ + func() + ’</h1>’ return call_func​def set_func_2(func): def call_func(): return ‘<td>’ + func() + ’</td>’ return call_func@set_func_1()@set_func_2()def get_str(): return ‘haha’print(get_str())最后執(zhí)行的效果: <h1><td>haha</td></h1>

6. 用類對(duì)函數(shù)進(jìn)行裝飾(了解):

class Test(object): def __init__(self,func): self.func = fun def __call__(self): print(‘這里是裝飾器的功能。。。。’) return self.func()@Testdef get_str(): return ‘haha’print(get_str())

以上就是裝飾器與閉包的全部?jī)?nèi)容

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 成年人免费在线观看网站 | 国产美女操 | 日韩在线不卡一区在线观看 | 欧美一区二区在线 | 精品国产一区二区三区不卡在线 | 亚洲国产欧美一区二区欧美 | 亚洲一级在线 | 亚洲免费网址 | 女人张开双腿让男人桶完整 | 亚洲国产第一区二区香蕉 | 另类专区 亚洲 | 久草在线免费看 | 欧美另类综合 | 国产高清一区二区 | 免费观看久久 | 国产三级小视频在线观看 | 欧美精品毛片 | 久久www免费人成看国产片 | 欧美特黄高清免费观看的 | 99精品在线免费观看 | 久草在线视频免费 | 深夜福利亚洲 | 亚洲精品国产福利一区二区三区 | 亚洲免费高清视频 | 欧美白人和黑人xxxx猛交视频 | 操欧美女 | 91久久亚洲精品国产一区二区 | 国产成人综合视频 | 日韩永久在线观看免费视频 | 亚洲第一视频网站 | 国产99视频精品免视看9 | 色偷偷成人网免费视频男人的天堂 | 国产午夜毛片v一区二区三区 | 91伊人久久 | 热99re久久精品香蕉 | 日韩中文字幕视频 | 国产精品视频免费播放 | 女高中生被cao到哭视频 | 你懂的国产精品 | 99精品一区二区三区 | 欧美另类久久久精品 |