閉包

一、瞭解函數的執行

def hello():

    print("hello")

hello()

看一下上面的代碼的執行過程,代碼在解釋器中是按照順序的,一開始從上往下執行時,在執行第一行語句時並不會跳入函數體,因爲此時的一二行代碼只是對函數進行了定義,只有當執行到hello()時,它才往後進入函數體進行執行。

二、瞭解函數的定義,調用,函數名,函數引用

1.函數定義,上面的一二行就是對函數進行定義

def 函數名():

    函數體

2.調用,python中對函數的調用使用 函數名()

3.函數名就是def和()之間的字符

4.函數引用,函數引用就是把函數名賦於另一個變量,這個變量和函數名指向同一個地址空間,同樣可以調用函數。

通過hello,a兩個變量可以看出他們屬於同種類型,通過id()變量可以看出他們指向同一內存空間。

三、閉包

def out(ms):
    def init():
        print(ms)
    return init
printer=out(1)
printer()

先看這樣一段代碼,代碼由上往下執行,第一行是對函數進行定義,但是沒有進入函數體,直到第五行,這行先執行右邊部分,1作爲實參代替ms的位置,調用函數,進入函數體,這時可以看出不同的是,函數體裏面還定義一個函數,二到三行,這是雖然進入了外面的函數體,可是裏面的函數依舊是函數定義,所以並沒有進入它函數體,外面函數體最後返回了裏面函數的函數名,所以我們可以像上面的例子一樣定義一個變量對函數進行引用,也從上面看出,引用的變量名加上()也一樣能對函數進行調用,而此時要清楚,我們返回的是裏面函數的函數名,我們定義的printer是對init函數的引用,最後一行其實就是對init()函數的調用。

也就進入init函數,調用print語句,而此時剛剛好用到前面的形參ms,在前面,其實系統以及把實參1傳進了形參ms裏面,所以此時對ms輸出。

1.閉包:在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變量,則可能產生閉包。閉包可以用來在一個函數與一組“私有”變量之間創建關聯關係。在給定函數被多次調用的過程中,這些私有變量能夠保持其持久性。

由此可見,上面的例子其實是一個閉包。閉包有兩個特徵:

1.把某個函數當成對象返回,上面例子中把init當成對象返回

2.夾帶着外部變量,在上面例子中ms是外部變量

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章