真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python語法之閉包

閉包的概念

阿克陶網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站建設等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選成都創(chuàng)新互聯(lián)公司

在計算機科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures),是引用了自由變量的函數(shù)。這個被引用的自由變量將和這個函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。

在一些語言中,在函數(shù)中可以(嵌套)定義另一個函數(shù)時,如果內(nèi)部的函數(shù)引用了外部的函數(shù)的變量,則可能產(chǎn)生閉包。運行時,一旦外部的 函數(shù)被執(zhí)行,一個閉包就形成了,閉包中包含了內(nèi)部函數(shù)的代碼,以及所需外部函數(shù)中的變量的引用。

函數(shù)名稱的引用傳遞

def func():

print("--- func is run ----")

func()

ret = func

print(id(ret))

print(id(func))

ret()

運行結(jié)果:

--- func is run ----

56145576

56145576

--- func is run ----

由上圖可知,和變量名一樣的,函數(shù)名只是函數(shù)代碼空間的引用,當函數(shù)名賦值給一個對象的時候就是引用傳遞。

局部-全局變量

定義在方法內(nèi)的變量是局部變量,不能在方法外做引用;定義在模塊最外層的變量是全局變量,它是全局范圍內(nèi)可見的。

那么問題來了,當方法內(nèi)部有嵌套方法時,嵌套方法能否使用父方法中定義的局部變量呢?答案是可以。

def outer_func():

data = 520

def inner_func():

return data

return inner_func()

print(outer_func())

運行結(jié)果:

520

此時調(diào)用 outer_func() 函數(shù)的返回值就是 520,所以說嵌套方法可以使用父方法中聲明的局部變量。

閉包的寫法

上面的概念還算比較容易理解,那么什么是閉包呢?我們來看下面一段代碼:

def outer_func():

data = 520

def inner_func():

return data

return inner_func

print(outer_func())

result = outer_func()

print(result())

運行結(jié)果:

.inner_func at 0x02D8B6A8>

520

閉包的執(zhí)行流程圖

執(zhí)行第 11 行代碼:

先執(zhí)行 print() 函數(shù)中的 outer_funcf() 函數(shù),并將內(nèi)層函數(shù) inner_func() 函數(shù)的內(nèi)存地址進行返回,最終 print() 函數(shù)將 return 返回的內(nèi)層函數(shù)地址進行打印輸出。

執(zhí)行第 13 行代碼:鄭州看婦科的醫(yī)院 http://www.ytsgfk120.com/

先執(zhí)行等號右側(cè)的 outer_func () 函數(shù),最終返回 inner_func() 函數(shù)的地址引用。等號左側(cè) result 變量進行接收內(nèi)層函數(shù)地址。

執(zhí)行第 15 行代碼:

先執(zhí)行 print() 函數(shù)中 result() 函數(shù),因為 result 變量保存了內(nèi)層函數(shù) inner_func() 函數(shù)的地址,所以 result 變量后面加上括號就相當于執(zhí)行 inner_func() 函數(shù)。執(zhí)行內(nèi)層函數(shù)并且將 data 值返回,最終使用 print() 函數(shù)將返回值打印輸出。

修改外部函數(shù)中的變量

nonlocal 關(guān)鍵字用來在函數(shù)或其他作用域中使用外層的(非全局)變量,修飾變量后表示該變量是上一級函數(shù)中的局部變量,如果上一級函數(shù)中不存在該局部變量,nonlocal 位置會發(fā)生錯誤(最上層的函數(shù)使用 nonlocal 修飾變量必定會報錯)。

data = 20

def outer_func():

data = 0

def inner_func():

nonlocal data

data = 666

print("--- inner_func ---:",data)

inner_func()

print("--- outer_func ---:",data)

outer_func()

print("--- 函數(shù)外 ---:",data)

運行結(jié)果:

--- inner_func ---: 666

--- outer_func ---: 666

--- 函數(shù)外 ---: 20

總結(jié)

函數(shù)名只是函數(shù)代碼空間的引用,當函數(shù)名賦值給一個對象的時候就是引用傳遞

定義在方法內(nèi)的變量是局部變量,不能在方法外做引用,但是可以被內(nèi)層函數(shù)引用。

閉包就是一個嵌套定義的函數(shù),在外層運行時才開始內(nèi)層函數(shù)的定義,然后將內(nèi)部函數(shù)的引用傳遞給函數(shù)外的對象

內(nèi)部函數(shù)和使用的外部函數(shù)提供的變量構(gòu)成的整體稱為閉包。


分享標題:Python語法之閉包
網(wǎng)址分享:http://weahome.cn/article/jjsjeh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部