亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

簡析Python的閉包和裝飾器

2020-01-04 17:42:32
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了Python的閉包和裝飾器,何為閉包?何為裝飾器?感興趣的小伙伴們可以參考一下
 

什么是裝飾器?
裝飾器(Decorator)相對簡單,咱們先介紹它:“裝飾器的功能是將被裝飾的函數當作參數傳遞給與裝飾器對應的函數(名稱相同的函數),并返回包裝后的被裝飾的函數”,聽起來有點繞,沒關系,直接看示意圖,其中 a 為與裝飾器 @a 對應的函數, b 為裝飾器修飾的函數,裝飾器@a的作用是:

簡析Python的閉包和裝飾器

簡而言之:@a 就是將 b 傳遞給 a(),并返回新的 b = a(b)

栗子:

簡析Python的閉包和裝飾器

上面使用@dobi來表示裝飾器,其等同于:qinfeng = dobi(qinfeng) 
因此裝飾器本質上就是個語法糖,其作用為簡化代碼,以提高代碼可讀性,運行上段代碼的結果為:

簡析Python的閉包和裝飾器

解析過程是這樣子的:
1.python 解釋器發現@dobi,就去調用與其對應的函數( dobi 函數)
2.dobi 函數調用前要指定一個參數,傳入的就是@dobi下面修飾的函數,也就是 qinfeng()
3.dobi() 函數執行,調用 qinfeng(),qinfeng() 打印“dobi”

什么是閉包?
首先還得從基本概念說起,什么是閉包呢?來看下維基上的解釋:
在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。閉包在運行時可以有多個實例,不同的引用環境和相同的函數組合可以產生不同的實例。
....
上面提到了兩個關鍵的地方: 自由變量 和 函數, 這兩個關鍵稍后再說。還是得在贅述下“閉包”的意思,望文知意,可以形象的把它理解為一個封閉的包裹,這個包裹就是一個函數,當然還有函數內部對應的邏輯,包裹里面的東西就是自由變量,自由變量可以在隨著包裹到處游蕩。當然還得有個前提,這個包裹是被創建出來的。
在通過Python的語言介紹一下,一個閉包就是你調用了一個函數A,這個函數A返回了一個函數B給你。這個返回的函數B就叫做閉包。你在調用函數A的時候傳遞的參數就是自由變量。
舉個栗子:

def func(name):  def inner_func(age):    print 'name:', name, 'age:', age  return inner_funcbb = func('the5fire')bb(26) # >>> name: the5fire age: 26

這里面調用func的時候就產生了一個閉包——inner_func,并且該閉包持有自由變量——name,因此這也意味著,當函數func的生命周期結束之后,name這個變量依然存在,因為它被閉包引用了,所以不會被回收。

另外再說一點,閉包并不是Python中特有的概念,所有把函數做為一等公民的語言均有閉包的概念。不過像Java這樣以class為一等公民的語言中也可以使用閉包,只是它得用類或接口來實現。

nonlocal 語句
在 python 的函數內,可以直接引用外部變量,但不能改寫外部變量,因此如果在閉包中直接改寫父函數的變量,就會發生錯誤:

簡析Python的閉包和裝飾器

在 python 2 中可以在函數內使用 global 語句,但全局變量在任何語言中都不被提倡,因為它很難控制,python 3 中引入了 nonlocal 語句解決了這個問題:

簡析Python的閉包和裝飾器

Nonlocal 與 global 的區別在于 nonlocal 語句會去搜尋本地變量與全局變量之間的變量,其會優先尋找層級關系與閉包作用域最近的外部變量。

閉包與裝飾器
上面已經簡單演示了裝飾器的功能,事實上,裝飾器就是一種的閉包的應用,只不過其傳遞的是函數:

簡析Python的閉包和裝飾器

@makeitalic 裝飾器將函數 hello 傳遞給函數 makeitalic,函數 makeitalic 執行完畢后返回被包裝后的 hello 函數,而這個過程其實就是通過閉包實現的。@makebold 也是如此,只不過其傳遞的是 @makeitalic 裝飾過的 hello 函數,因此最后的執行結果 <b> 在 <i> 外層,這個功能如果不用裝飾器,其實就是顯式的使用閉包:

簡析Python的閉包和裝飾器

閉包的作用
閉包的最大特點是可以將父函數的變量與內部函數綁定,并返回綁定變量后的函數(也即閉包),此時即便生成閉包的環境(父函數)已經釋放,閉包仍然存在,這個過程很像類(父函數)生成實例(閉包),不同的是父函數只在調用時執行,執行完畢后其環境就會釋放,而類則在文件執行時創建,一般程序執行完畢后作用域才釋放,因此對一些需要重用的功能且不足以定義為類的行為,使用閉包會比使用類占用更少的資源,且更輕巧靈活,現舉一例:假設我們僅僅想打印出各類動物的叫聲,分別以類和閉包來實現:

簡析Python的閉包和裝飾器

可以看到輸出結果是完全一樣的,但顯然類的實現相對繁瑣,且這里只是想輸出一下動物的叫聲,定義一個 Animal 類未免小題大做,而且 voice 函數在執行完畢后,其作用域就已經釋放,但 Animal 類及其實例 dog 的相應屬性卻一直貯存在內存中:

簡析Python的閉包和裝飾器

而這種占用對于實現該功能后,則是沒有必要的。

除此之外,閉包還有很多其他功能,比如用于封裝等,另外,閉包有效的減少了函數參數的數目,這對并行計算非常有價值,比如可以讓每臺電腦負責一個函數,然后串起來,實現流水化的作業等。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲免费的视频看| 国内外成人免费激情在线视频网站| 国产91ⅴ在线精品免费观看| 在线国产精品视频| 日韩三级影视基地| 性色av一区二区咪爱| 欧美最猛性xxxxx(亚洲精品)| 九九热最新视频//这里只有精品| 亚洲欧美激情精品一区二区| 欧美激情精品久久久久| 久久免费高清视频| 色狠狠av一区二区三区香蕉蜜桃| 亚洲一区二区久久久久久| 成人国产精品av| 国产成人一区二区| 国产伦精品一区二区三区精品视频| 97色在线观看免费视频| 久热精品在线视频| 美女啪啪无遮挡免费久久网站| 精品久久久久久中文字幕一区奶水| 在线播放亚洲激情| 国产91av在线| 成人欧美一区二区三区在线| 日韩在线视频观看正片免费网站| 久久伊人色综合| 欧美区二区三区| 清纯唯美日韩制服另类| 精品高清美女精品国产区| 成人亚洲综合色就1024| 久久久成人精品| 国产欧美一区二区三区久久| 亚洲综合大片69999| 成人黄色激情网| 91久久久久久久久久久久久| www.欧美精品| 亚洲天堂影视av| 欧美床上激情在线观看| 97婷婷涩涩精品一区| 国产精品一区二区三区毛片淫片| 一区二区日韩精品| 久久久久日韩精品久久久男男| 精品日韩美女的视频高清| 色一区av在线| 亚洲精品自拍第一页| 日韩视频在线观看免费| 精品国产91久久久久久| 美女国内精品自产拍在线播放| 日韩www在线| 欧美成人高清视频| 久久久久久久亚洲精品| 欧美日韩午夜激情| 国产91色在线|免| 在线看片第一页欧美| 国产精品久久久久av| 久久久久久国产免费| 黑人巨大精品欧美一区免费视频| 国产综合在线观看视频| 国内精品免费午夜毛片| 亚洲激情 国产| 91国产视频在线| 久久久久亚洲精品国产| 国产在线久久久| 久久人人爽人人爽人人片亚洲| 98视频在线噜噜噜国产| 国产色综合天天综合网| 国产精品久久久久久久久久东京| 欧美理论电影在线观看| 欧美日韩国产二区| 亚洲色图17p| 92国产精品久久久久首页| 精品调教chinesegay| 中文字幕在线日韩| 久久久免费精品| 精品福利视频导航| 成人国产精品免费视频| 久久久av一区| 欧美乱妇高清无乱码| 欧美成人激情视频免费观看| 97视频免费在线看| 国产z一区二区三区| 亚洲综合自拍一区| 日韩激情视频在线| 91免费看片网站| 日本久久久久久久久| 日韩精品中文字幕有码专区| 尤物tv国产一区| 黄色成人在线播放| 精品国产一区二区三区久久| 夜夜躁日日躁狠狠久久88av| 色噜噜国产精品视频一区二区| 日韩av免费在线观看| 国产欧美日韩中文字幕在线| 国产91成人在在线播放| 91精品久久久久久久久久久久久久| 2020欧美日韩在线视频| 亚洲欧美色婷婷| 亚洲欧美另类国产| 国产中文字幕亚洲| 色综合久久精品亚洲国产| 国产一区二区三区中文| 亚洲资源在线看| 国产精品嫩草视频| 久久久久久综合网天天| 亚洲国产又黄又爽女人高潮的| 一区二区三区四区精品| 日本欧美一级片| 久久免费精品日本久久中文字幕| 精品精品国产国产自在线| 亚洲一区二区日本| 最新国产成人av网站网址麻豆| 91精品国产成人www| 亚洲精品女av网站| 91视频国产精品| 欧洲美女7788成人免费视频| 成人免费淫片视频软件| 亚洲国产成人精品一区二区| 成人精品aaaa网站| 亚洲人av在线影院| 免费97视频在线精品国自产拍| 国产精品久久久久久久久久久不卡| 亚洲精品v欧美精品v日韩精品| 欧美性xxxx| 国产一区二区成人| 最新日韩中文字幕| 久久久免费观看视频| 中文字幕综合一区| 国产亚洲精品久久久优势| 一区二区欧美在线| 亚洲**2019国产| 国产久一一精品| 4438全国成人免费| 97人人爽人人喊人人模波多| 亚洲欧洲一区二区三区在线观看| 久久久精品一区二区三区| 日韩在线激情视频| 久久久国产精品x99av| 久久久久久久久久久亚洲| 91精品国产91久久久久福利| 欧美大尺度激情区在线播放| 久久人人97超碰精品888| 色www亚洲国产张柏芝| 91在线免费视频| 日韩欧美在线免费| 精品视频中文字幕| 91精品国产免费久久久久久| 在线成人免费网站| 欧美乱人伦中文字幕在线| 久久av中文字幕| 青青草原一区二区| 亚洲国产另类 国产精品国产免费| 国产精品对白刺激| 日韩成人av在线播放| 深夜福利亚洲导航| 中文字幕不卡在线视频极品| 日韩一区二区久久久| 欧美黑人狂野猛交老妇| 不卡av在线网站| 一区二区欧美在线| 欧美成人免费视频| 色综合久久悠悠| 国产丝袜视频一区| 大荫蒂欧美视频另类xxxx| 欧美俄罗斯乱妇| 欧美丝袜一区二区|