亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

什么是閉包及Python中的閉包

系統 1520 0

什么是閉包

Objects are data with methods attached. Closures are functions with data attached.

一般來說,我們都非常熟悉面向對象(OOD)語言中的對象的概念。所謂對象(Object),指的是附帶相應方法的__數據__。那么相對而言,閉包(closure)指的則是附帶相應數據的__函數__。換句話說,閉包函數能夠引用一些并不在當前代碼全局上下文中定義的變量。這些被引用的變量(稱為自由變量)是在閉包函數被定義的位置的所在的代碼中定義的。這樣的一些函數被稱為閉包。

Python中的閉包

由于在Python中,函數也是第一類對象,所以與字符串,數字或其他任何我們所熟悉的對象一樣,函數也可以被賦值給一個變量,作為另一個函數的返回值,或作為一個輸入參數傳遞給另一個函數。這就使得定義閉包非常的方便,如下面的例子所示。

            
              
                def
              
              
                constant_adder
              
              
                (
              
              x
              
                )
              
              
                :
              
              
    constant 
              
                =
              
               x
    
              
                def
              
              
                adder
              
              
                (
              
              y
              
                )
              
              
                :
              
              
        y 
              
                =
              
               y 
              
                +
              
               constant
        
              
                return
              
               y
    
              
                return
              
               adder


              
                # Given the above function
              
              
                >>
              
              
                >
              
               f1 
              
                =
              
               constant_adder
              
                (
              
              
                1
              
              
                )
              
              
                >>
              
              
                >
              
               f1
              
                (
              
              
                2
              
              
                )
              
              
                >>
              
              
                >
              
              
                3
              
              
                >>
              
              
                >
              
               f2 
              
                =
              
               constant_adder
              
                (
              
              
                10
              
              
                )
              
              
                >>
              
              
                >
              
               f2
              
                (
              
              
                2
              
              
                )
              
              
                >>
              
              
                >
              
              
                12
              
            
          

在上述例子中,我們可以發現在調用 f1 f2 的時候, constant_adder 的作用域事實上已經結束。這里的 constant 就是一個自由變量,我們仍然在 f1 f2 中調用了在 constant_adder 中的定義的 constant 變量,這就是一個附帶相應數據的函數。

另外,在Python3.x以前,我們只能在閉包中取得自由變量的值,但無法改變自由變量的值。重新賦值自由變量的行為將會導致一個作用域為當前函數的局部變量的產生。Python3.0引入了 nonlocal 關鍵字,使得我們不僅能夠讀取自由變量,也能夠重新賦值自由變量。如下面的例子所示。

            
              
                def
              
              
                foo
              
              
                (
              
              
                )
              
              
                :
              
              
    x 
              
                =
              
              
                1
              
              
                def
              
              
                show
              
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                "x is {}"
              
              
                .
              
              
                format
              
              
                (
              
              x
              
                )
              
              
                )
              
              
                def
              
              
                change
              
              
                (
              
              
                )
              
              
                :
              
              
                nonlocal
              
               x
        x 
              
                =
              
              
                2
              
              
                return
              
               show
              
                ,
              
               change


              
                # Given the above function
              
              
                >>
              
              
                >
              
               show
              
                ,
              
               change 
              
                =
              
               foo
              
                (
              
              
                )
              
              
                >>
              
              
                >
              
               show
              
                (
              
              
                )
              
              
                >>
              
              
                >
              
               x 
              
                is
              
              
                1
              
              
                >>
              
              
                >
              
               change
              
                (
              
              
                )
              
              
                >>
              
              
                >
              
               show
              
                (
              
              
                )
              
              
                >>
              
              
                >
              
               x 
              
                is
              
              
                2
              
            
          

Reference
https://stackoverflow.com/questions/13857/can-you-explain-closures-as-they-relate-to-python
http://mrevelle.blogspot.com/2006/10/closure-on-closures.html


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产一区二区高清在线 | 欧美啊v| 亚洲一区中文字幕在线观看 | 在线播放国产区 | 99久久香蕉国产综合影院 | 亚洲好视频 | 国产在线精彩视频二区 | 久久久久久免费精品视频 | 国产麻豆永久视频 | 午夜a一级毛片一.成 | 国产在线免| 日本精品a在线 | 日本一区毛片免费观看 | 手机看片自拍日韩日韩高清 | 日韩视频一区二区在线观看 | 欧美白人极品性喷潮 | 亚洲欧美国产18 | 欧美激情一区二区三级高清视频 | 妖精视频免费在线观看 | 国内成人免费视频 | 亚洲精品久久久久久久网站 | 精品乱码一区二区三区在线 | 女人18一级特级毛片免费看 | 全部毛片| 伊人久久综合影院 | 亚洲欧美日韩一区二区 | 天天爽天天狼久久久综合 | 四虎影视免费观看免费观看 | 久久精品福利视频 | 天天噜夜夜操 | 99久久国产综合精品2020 | 综合网婷婷 | 一本到视频在线观看 | 精品国产亚洲一区二区三区 | 成人高清视频在线观看大全 | 日本免费一区二区三区 | 无毒不卡在线观看 | 亚洲国产成人精彩精品 | 精品久久久久久蜜臂a∨ | 成人影院免费在线观看 | 日韩成人小视频 |