溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中閉包的作用

發布時間:2020-08-26 10:04:13 來源:億速云 閱讀:192 作者:Leah 欄目:編程語言

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

1、global關鍵字的作用

如果在函數中需要修改全局變量,則需要使用該關鍵字,具體參見下面例子。

variable=100
def function():
print(variable) #在函數內不對全局變量修改,直接訪問是沒問題的,不會報錯
function() #輸出100
 
variable=100
def function():
result=variable+111
print(result) #在函數內不對全局變量修改,直接使用是沒問題的,不會報錯
function() #輸出211
variable=100
def function():
variable+=111
print(variable) #顯示local variable 'variable' referenced before assignment。
#即在函數局部作用域中直接改變全局變量的值會報錯
function()
variable=100
def function():
variable=1000 #此時修改variable變量的值不會報錯,因為已經在函數局部作用域內重新定義variable,會覆蓋全局variable
variable+=111
print(variable)
function() #輸出1111
print(variable) #輸出100,雖然函數內部重新覆蓋了variable,但是全局variable并未變,依然還是100

那如果不再函數內部重新為全局變量賦值,又想改變全局變量的值,應該怎么做呢?這就要使用global關鍵字了,如下:

variable=100
def function():
global variable #使用global關鍵字,表明variable是全局的,此時就可以了直接在函數局部作用域內改變variable的值了
variable+=111
print(variable) #輸出211
function()
print(variable) #輸出211,這和上面的不一樣了,發現全局變量variable本身也改變了

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

2、函數局部作用域

函數的局部作用域是不能夠保存信息的,即在函數內部聲明變量在函數調用結束之后函數里面保存的信息就被銷毀了,包括函數的參數,如下:

def fun(step):
num=1
num+=step
print(num)
i=1
while(i<5):
fun(3) #連續調用函數4次,每次輸出的值都是4,即3+1,這說明每次調用fun函數之后,函數內部定義局部變量num就被銷毀了,
#沒有保存下來,說明函數的局部作用域被銷毀了。那如果要保存函數的局部變量,怎么辦呢?引入“閉包”。
i+=1

3、閉包——裝飾器的本質也是閉包

“閉包”的本質就是函數的嵌套定義,即在函數內部再定義函數,如下所示。

“閉包”有兩種不同的方式,第一種是在函數內部就“直接調用了”;第二種是“返回一個函數名稱”。

(1)第一種形式——直接調用

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) #在內部就直接調用“內部函數”
Maker('feifei') #調用外部函數,輸出 feifei 101 201 301

(2)第二種形式——返回函數名稱

def Maker(name):
num=100
def func1(weight,height,age):
weight+=1
height+=1
age+=1
print(name,weight,height,age)
return func1 #此處不直接調用,而是返回函數名稱(Python中一切皆對象)
maker=Maker('feifei') #調用包裝器
maker(100,200,300) #調用內部函數

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

def Maker(step): #包裝器
num=1
def fun1(): #內部函數
nonlocal num #nonlocal關鍵字的作用和前面的local是一樣的,如果不使用該關鍵字,則不能再內部函數改變“外部變量”的值
num=num+step #改變外部變量的值(如果只是訪問外部變量,則不需要適用nonlocal)
print(num)
return fun1
#=====================================#
j=1
func2=Maker(3) #調用外部包裝器
while(j<5):
func2() #調用內部函數4次 輸出的結果是 4、7、10、13
j+=1

從上面的例子可以看出,外部裝飾器函數的局部變量num=1、以及調用裝飾器Maker(3)時候傳入的參數step=3都被記憶了下來,所以才有1+3=4、4+3=7、7+3=10、10+3=13。

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

4、nonlocal關鍵字的作用

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

上述內容就是python中閉包的作用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女