一、瞭解函數的執行
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是外部變量