1、python裡面定義函式和c裡面一樣,也存在函式的巢狀定義,eg:2、由於在python函式定義的時候,出現區域性變數和全域性變數的名稱相同的時候,記憶體自動分配乙個和外部變數相同的名稱來儲存區域性變數的值,所以,在函式內部,遮蔽全域性變數,所以當出現如下情況:則在函式呼叫的時候需要傳遞2個實參,分別給x,y 且形式為:result=fun1(a)(b)def fun1(x):
def fun2(y):
z=x*y
return z
return fun2
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 可以用來宣告
該變數不是區域性變數 解決問題(即可以修改外部函式的區域性變數)
呼叫巢狀函式re=fun1(1)(2) 可得到結果 8(a+x+y)def fun1(x):
a=5def fun2(y):
nonlocal a
a=a+x+y
return a
return fun2
故:當在巢狀函式中,對上級函式區域性變數或者全域性變數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)
注:若對於上面的函式,得到temp=fun1(1), 執行result=temp(2)後,temp並沒有被釋放掉,還是乙個函式型別,且為fun1(1)所以,只要temp沒有被重新賦值,就不會改變,這就是閉包,所以:result
8
即在原來的函式基礎上,依次迭代執行fun2, (閉包)print(temp(2))
11print(temp(2))
14
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...