python中閉包的作用

本篇文章為大家展示了python中閉包的作用,代碼簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

在網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站過(guò)程中,需要針對(duì)客戶的行業(yè)特點(diǎn)、產(chǎn)品特性、目標(biāo)受眾和市場(chǎng)情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計(jì)方向。創(chuàng)新互聯(lián)還需要根據(jù)客戶的需求進(jìn)行功能模塊的開(kāi)發(fā)和設(shè)計(jì),包括內(nèi)容管理、前臺(tái)展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計(jì)和安全保護(hù)等功能。

1、global關(guān)鍵字的作用

如果在函數(shù)中需要修改全局變量,則需要使用該關(guān)鍵字,具體參見(jiàn)下面例子。

variable=100
def function():
print(variable) #在函數(shù)內(nèi)不對(duì)全局變量修改,直接訪問(wèn)是沒(méi)問(wèn)題的,不會(huì)報(bào)錯(cuò)
function() #輸出100
 
variable=100
def function():
result=variable+111
print(result) #在函數(shù)內(nèi)不對(duì)全局變量修改,直接使用是沒(méi)問(wèn)題的,不會(huì)報(bào)錯(cuò)
function() #輸出211
variable=100
def function():
variable+=111
print(variable) #顯示local variable 'variable' referenced before assignment。
#即在函數(shù)局部作用域中直接改變?nèi)肿兞康闹禃?huì)報(bào)錯(cuò)
function()
variable=100
def function():
variable=1000 #此時(shí)修改variable變量的值不會(huì)報(bào)錯(cuò),因?yàn)橐呀?jīng)在函數(shù)局部作用域內(nèi)重新定義variable,會(huì)覆蓋全局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í)就可以了直接在函數(shù)局部作用域內(nèi)改變variable的值了
variable+=111
print(variable) #輸出211
function()
print(variable) #輸出211,這和上面的不一樣了,發(fā)現(xiàn)全局變量variable本身也改變了

總結(jié):global的作用就是在“函數(shù)局部作用域”內(nèi)聲明表示一個(gè)全局變量,從而可以在函數(shù)內(nèi)部修改全局變量的值(否則只能訪問(wèn)不能修改),而且函數(shù)內(nèi)部改變的全局變量的值也會(huì)改變。

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,這說(shuō)明每次調(diào)用fun函數(shù)之后,函數(shù)內(nèi)部定義局部變量num就被銷毀了,
#沒(méi)有保存下來(lái),說(shuō)明函數(shù)的局部作用域被銷毀了。那如果要保存函數(shù)的局部變量,怎么辦呢?引入“閉包”。
i+=1

3、閉包——裝飾器的本質(zhì)也是閉包

“閉包”的本質(zhì)就是函數(shù)的嵌套定義,即在函數(shù)內(nèi)部再定義函數(shù),如下所示。

“閉包”有兩種不同的方式,第一種是在函數(shù)內(nèi)部就“直接調(diào)用了”;第二種是“返回一個(gè)函數(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中一切皆對(duì)象)
maker=Maker('feifei') #調(diào)用包裝器
maker(100,200,300) #調(diào)用內(nèi)部函數(shù)

(3)“閉包”的作用——保存函數(shù)的狀態(tài)信息,使函數(shù)的局部變量信息依然可以保存下來(lái),如下:

def Maker(step): #包裝器
num=1
def fun1(): #內(nèi)部函數(shù)
nonlocal num #nonlocal關(guān)鍵字的作用和前面的local是一樣的,如果不使用該關(guān)鍵字,則不能再內(nèi)部函數(shù)改變“外部變量”的值
num=num+step #改變外部變量的值(如果只是訪問(wèn)外部變量,則不需要適用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í)候傳入的參數(shù)step=3都被記憶了下來(lái),所以才有1+3=4、4+3=7、7+3=10、10+3=13。

從這里可以看出,Maker函數(shù)雖然調(diào)用了,但是它的局部變量信息卻被保存了下來(lái),這就是“閉包”的最大的作用——保存局部信息不被銷毀。

4、nonlocal關(guān)鍵字的作用

該關(guān)鍵字的作用和local的作用類似,就是讓“內(nèi)部函數(shù)”可以修改“外部函數(shù)(裝飾器)”的局部變量值。

上述內(nèi)容就是python中閉包的作用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:python中閉包的作用
文章來(lái)源:http://bm7419.com/article46/jcijhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、App開(kāi)發(fā)、Google、商城網(wǎng)站、App設(shè)計(jì)、企業(yè)網(wǎng)站制作

廣告

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

成都網(wǎng)站建設(shè)