創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
目前創(chuàng)新互聯(lián)公司已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、牡丹網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。這篇文章運(yùn)用簡單易懂的例子給大家介紹python閉包的作用是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1、global關(guān)鍵字的作用
python學(xué)習(xí)網(wǎng),大量的免費(fèi)python視頻教程,歡迎在線學(xué)習(xí)!
如果在函數(shù)中需要修改全局變量,則需要使用該關(guān)鍵字,具體參見下面例子。
variable=100 def function(): print(variable) #在函數(shù)內(nèi)不對全局變量修改,直接訪問是沒問題的,不會報錯 function() #輸出100 variable=100 def function(): result=variable+111 print(result) #在函數(shù)內(nèi)不對全局變量修改,直接使用是沒問題的,不會報錯 function() #輸出211 variable=100 def function(): variable+=111 print(variable) #顯示local variable 'variable' referenced before assignment。 #即在函數(shù)局部作用域中直接改變?nèi)肿兞康闹禃箦e function() variable=100 def function(): variable=1000 #此時修改variable變量的值不會報錯,因為已經(jīng)在函數(shù)局部作用域內(nèi)重新定義variable,會覆蓋全局variable。 variable+=111 print(variable) function() #輸出1111 print(variable) #輸出100,雖然函數(shù)內(nèi)部重新覆蓋了variable,但是全局variable并未變,依然還是100
那如果不再函數(shù)內(nèi)部重新為全局變量賦值,又想改變?nèi)肿兞康闹担瑧?yīng)該怎么做呢?這就要使用global關(guān)鍵字了,如下。
variable=100 def function(): global variable #使用global關(guān)鍵字,表明variable是全局的,此時就可以了直接在函數(shù)局部作用域內(nèi)改變variable的值了 variable+=111 print(variable) #輸出211 function() print(variable) #輸出211,這和上面的不一樣了,發(fā)現(xiàn)全局變量variable本身也改變了
總結(jié):global的作用就是在“函數(shù)局部作用域”內(nèi)聲明表示一個全局變量,從而可以在函數(shù)內(nèi)部修改全局變量的值(否則只能訪問不能修改),而且函數(shù)內(nèi)部改變的全局變量的值也會改變。
2、函數(shù)局部作用域
函數(shù)的局部作用域是不能夠保存信息的,即在函數(shù)內(nèi)部聲明變量在函數(shù)調(diào)用結(jié)束之后函數(shù)里面保存的信息就被銷毀了,包括函數(shù)的參數(shù),如下。
def fun(step): num=1 num+=step print(num) i=1 while(i<5): fun(3) #連續(xù)調(diào)用函數(shù)4次,每次輸出的值都是4,即3+1,這說明每次調(diào)用fun函數(shù)之后,函數(shù)內(nèi)部定義局部變量num就被銷毀了, #沒有保存下來,說明函數(shù)的局部作用域被銷毀了。那如果要保存函數(shù)的局部變量,怎么辦呢?引入“閉包”。 i+=1
3、閉包——裝飾器的本質(zhì)也是閉包
“閉包”的本質(zhì)就是函數(shù)的嵌套定義,即在函數(shù)內(nèi)部再定義函數(shù),如下所示。
“閉包”有兩種不同的方式,第一種是在函數(shù)內(nèi)部就“直接調(diào)用了”;第二種是“返回一個函數(shù)名稱”。
(1)第一種形式——直接調(diào)用
def Maker(name): num=100 def func1(weight,height,age): weight+=1 height+=1 age+=1 print(name,weight,height,age) func1(100,200,300) #在內(nèi)部就直接調(diào)用“內(nèi)部函數(shù)” Maker('feifei') #調(diào)用外部函數(shù),輸出 feifei 101 201 301
(2)第二種形式——返回函數(shù)名稱
def Maker(name): num=100 def func1(weight,height,age): weight+=1 height+=1 age+=1 print(name,weight,height,age) return func1 #此處不直接調(diào)用,而是返回函數(shù)名稱(Python中一切皆對象) maker=Maker('feifei') #調(diào)用包裝器 maker(100,200,300) #調(diào)用內(nèi)部函數(shù)
(3)“閉包”的作用——保存函數(shù)的狀態(tài)信息,使函數(shù)的局部變量信息依然可以保存下來,如下。
ef Maker(step): #包裝器 num=1 def fun1(): #內(nèi)部函數(shù) nonlocal num #nonlocal關(guān)鍵字的作用和前面的local是一樣的,如果不使用該關(guān)鍵字,則不能再內(nèi)部函數(shù)改變“外部變量”的值 num=num+step #改變外部變量的值(如果只是訪問外部變量,則不需要適用nonlocal) print(num) return fun1 #=====================================# j=1 func2=Maker(3) #調(diào)用外部包裝器 while(j<5): func2() #調(diào)用內(nèi)部函數(shù)4次 輸出的結(jié)果是 4、7、10、13 j+=1
從上面的例子可以看出,外部裝飾器函數(shù)的局部變量num=1、以及調(diào)用裝飾器Maker(3)時候傳入的參數(shù)step=3都被記憶了下來,所以才有1+3=4、4+3=7、7+3=10、10+3=13.
從這里可以看出,Maker函數(shù)雖然調(diào)用了,但是它的局部變量信息卻被保存了下來,這就是“閉包”的大的作用——保存局部信息不被銷毀。
4、nonlocal關(guān)鍵字的作用
該關(guān)鍵字的作用和local的作用類似,就是讓“內(nèi)部函數(shù)”可以修改“外部函數(shù)(裝飾器)”的局部變量值。詳細(xì)信息這里不做討論。
關(guān)于python閉包的作用是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
本文標(biāo)題:python閉包的作用是什么-創(chuàng)新互聯(lián)
本文鏈接:http://www.rwnh.cn/article22/ddcsjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、網(wǎng)站內(nèi)鏈、服務(wù)器托管、全網(wǎng)營銷推廣、云服務(wù)器、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容