内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Python語法之閉包-創(chuàng)新互聯

閉包的概念

成都創(chuàng)新互聯長期為上1000+客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態(tài)環(huán)境。為伊犁企業(yè)提供專業(yè)的成都網站建設、網站設計,伊犁網站改版等技術服務。擁有10年豐富建站經驗和眾多成功案例,為您定制開發(fā)。

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

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

函數名稱的引用傳遞

def func():

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

func()

ret = func

print(id(ret))

print(id(func))

ret()

運行結果:

--- func is run ----

56145576

56145576

--- func is run ----

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

局部-全局變量

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

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

def outer_func():

data = 520

def inner_func():

return data

return inner_func()

print(outer_func())

運行結果:

520

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

閉包的寫法

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

def outer_func():

data = 520

def inner_func():

return data

return inner_func

print(outer_func())

result = outer_func()

print(result())

運行結果:

.inner_func at 0x02D8B6A8>

520

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

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

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

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

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

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

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

修改外部函數中的變量

nonlocal 關鍵字用來在函數或其他作用域中使用外層的(非全局)變量,修飾變量后表示該變量是上一級函數中的局部變量,如果上一級函數中不存在該局部變量,nonlocal 位置會發(fā)生錯誤(最上層的函數使用 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("--- 函數外 ---:",data)

運行結果:

--- inner_func ---: 666

--- outer_func ---: 666

--- 函數外 ---: 20

總結

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

定義在方法內的變量是局部變量,不能在方法外做引用,但是可以被內層函數引用。

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

內部函數和使用的外部函數提供的變量構成的整體稱為閉包。

另外有需要云服務器可以了解下創(chuàng)新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網站題目:Python語法之閉包-創(chuàng)新互聯
路徑分享:http://m.rwnh.cn/article20/cecijo.html

成都網站建設公司_創(chuàng)新互聯,為您提供App開發(fā)、外貿網站建設定制網站、靜態(tài)網站面包屑導航、ChatGPT

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都做網站
福建省| 屯昌县| 靖江市| 呼玛县| 营山县| 青铜峡市| 雷州市| 德江县| 桃园县| 淮安市| 包头市| 平江县| 青神县| 稻城县| 无为县| 龙海市| 朝阳县| 万全县| 蕲春县| 房山区| 桐梓县| 凤城市| 大竹县| 阿巴嘎旗| 湘阴县| 婺源县| 随州市| 阿拉善左旗| 台东县| 赣榆县| 多伦县| 龙胜| 宕昌县| 金昌市| 枝江市| 南丰县| 英吉沙县| 内丘县| 白河县| 清丰县| 宁乡县|