日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

什么是閉包及Python中的閉包

系統 1684 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條評論
主站蜘蛛池模板: 溆浦县| 台安县| 陆良县| 东阳市| 瓦房店市| 湟中县| 博白县| 名山县| 崇明县| 吴桥县| 久治县| 闻喜县| 万州区| 和顺县| 宽城| 五寨县| 乌拉特后旗| 蚌埠市| 鄯善县| 砚山县| 千阳县| 延安市| 镇安县| 延川县| 邢台县| 康保县| 康定县| 富源县| 达州市| 疏勒县| 侯马市| 健康| 营山县| 青田县| 祁东县| 饶阳县| 全南县| 旅游| 无为县| 嘉兴市| 泸定县|