內嵌函式和閉包

2021-06-26 11:47:15 字數 1791 閱讀 2781

1、python裡面定義函式和c裡面一樣,也存在函式的巢狀定義,eg:

def fun1(x):

def fun2(y):

z=x*y

return z

return fun2

則在函式呼叫的時候需要傳遞2個實參,分別給x,y 且形式為:result=fun1(a)(b)

2、由於在python函式定義的時候,出現區域性變數和全域性變數的名稱相同的時候,記憶體自動分配乙個和外部變數相同的名稱來儲存區域性變數的值,所以,在函式內部,遮蔽全域性變數,所以當出現如下情況:

def funx(x):

a=100

z=x*a

return z

a=90

re=funx(0.8)

print (a)

如果想在函式中修改全域性變數 x,需要在函式裡面做宣告:global x

a的返回值仍然是90

3、當在函式巢狀的時候,在巢狀函式中需要用到上級函式(外部函式)的變數的時候若形式為:  

def fun1(x):

a=5def fun2(y):

a=a+x+y

return a

return fun2

函式會報錯:變數 a 在設定之前被引用了,原因是上級函式的區域性變數值被改變,

利用nonlocal 可以用來宣告

該變數不是區域性變數 解決問題(即可以修改外部函式的區域性變數)

def fun1(x):

a=5def fun2(y):

nonlocal a

a=a+x+y

return a

return fun2

呼叫巢狀函式re=fun1(1)(2) 可得到結果 8(a+x+y)

故:當在巢狀函式中,對上級函式區域性變數或者全域性變數a,在該級函式中,若直接賦值操作則系統會重新分配位址給新的另乙個區域性變數a(同名不同值),若對a進行變數操作,則系統報錯 (沒有對a進行賦值而引用)

4、對於巢狀函式,可以曲線形式呼叫:

如上fun1() 函式,可以令temp=fun1(1)--->得到的.fun2 at 0x02370420>,即得到的中間變數 temp 的型別是『function』,當再次呼叫內部子函式的時候得到最終結果:re=temp(2)---->8:

def fun1(x):

a=5def fun2(y):

nonlocal a

a=a+x+y

return a

return fun2

temp=fun1(1)

temp

.fun2 at 0x02370420>

type(temp)

result=temp(2)

result

8

注:若對於上面的函式,得到temp=fun1(1), 執行result=temp(2)後,temp並沒有被釋放掉,還是乙個函式型別,且為fun1(1)所以,只要temp沒有被重新賦值,就不會改變,這就是閉包,所以:

print(temp(2))

11print(temp(2))

14

即在原來的函式基礎上,依次迭代執行fun2, (閉包)

python 內嵌函式和閉包

在函式體內定義函式 定義a 函式 defa print a 函式 定義b 函式 defb print b 函式 呼叫b 函式 b 呼叫a 函式 a 輸出 a 函式 b 函式 定義閉包函式 defa num1 def b num2 return num1 num2 return b 檢視a 函式的返回...

課時20 內嵌函式和閉包

目錄 一 global關鍵字 二 內嵌函式 三 閉包 四 課時20課後習題及答案 一 global關鍵字 全域性變數的作用域是整個模組 整個 段 也就是 段內所有的函式內部都可以訪問到全域性變數。但是要注意一點,在函式內部僅僅去訪問全域性變數就好,不要試圖去修改它。因為那樣的話,python會使用遮...

L20函式 內嵌函式和閉包

global關鍵字 如果函式內部試圖修改全域性變數,python會自己遮蔽 shadowing count 5 def myfun count 10 print 10 myfun 10 print count 5加入global關鍵字 宣告函式內的該變數是全域性變數 def myfun global...