目錄:
一、global關鍵字
二、內嵌函式
三、閉包
四、課時20課後習題及答案
一、global關鍵字
全域性變數的作用域是整個模組(整個**段),也就是**段內所有的函式內部都可以訪問到全域性變數。但是要注意一點,在函式內部僅僅去訪問全域性變數就好,不要試圖去修改它。
因為那樣的話,python會使用遮蔽的方式」保護「全域性變數:一旦函式內部試圖修改全域性變數,python就會在函式內部自動建立乙個名字一模一樣的區域性變數,這樣修改的結果只會修改到區域性變數,而不會影響到全域性變數。看下面的例子:
>>> count=5如果覺得有必要在函式中去修改這個全域性變數,那麼你不妨可以使用global關鍵字來達到目的!修改程式如下:>>> def
myfun():
count = 10
(count)
>>>myfun()
10>>>count
5
>>> count=5二、內嵌函式python函式定義是可以巢狀的,也就是允許在函式的內部建立另外乙個函式,這種函式叫做內嵌函式或者內部函式。舉個例子:>>> def
myfun():
global
count
count = 10
(count)
>>>myfun()
10>>>count
10
>>> def值得注意的是:就是內部函式整個作用域都在外部函式之內。fun1():
print("
fun1()正在被呼叫")
deffun2():
print("
fun2()正在被呼叫")
fun2()
>>>fun1()
fun1()正在被呼叫
fun2()正在被呼叫
另外需要注意的地方:如果在fun1()外部試圖呼叫內部函式fun2(),就會報錯:
>>>fun2()三、閉包閉包是函式程式設計的乙個重要的語法結構,函式式程式設計是一種程式設計正規化,著名的函式式程式語言就是lisp語言。traceback (most recent call last):
file
"", line 1, in
fun2()
nameerror: name
'fun2'is
not defined
python中閉包從表現形式上定義為:如果在乙個內部函式內(funy就是這個內部函式),對外部作用域(但不是在全域性作用域)的變數進行引用(x就是被引用的變數,x在外部作用域funx裡面,但不在全域性作用域裡),那麼內部函式就被認為是閉包。
>>> def也可以直接這樣寫:funx(x):
deffuny(y):
return x*y
return
funy
>>> i = funx(8)
>>>i
.funy at 0x0000017296857488>
>>>type(i)
'function
'>
>>>type(funx)
'function
'>
>>>funx
>>> i(5)
40
>>> funx(8)(5)使用閉包時,需要注意的是:因為閉包的概念就是由內部函式而來的,所以也不能在外部函式以外的地方對內部函式進行呼叫:40
>>> funy(5)在閉包中,外部函式的區域性變數對應內部函式的區域性變數,實際上就相當於之前講的全域性變數跟區域性變數的關係,在內部函式中,你只能對外部函式的區域性變數進行訪問,但不能進行修改。traceback (most recent call last):
file
"", line 1, in
funy(5)
nameerror: name
'funy'is
not defined
>>> def這個錯誤資訊跟之前講解全域性變數的時候基本一樣,python認為在內部函式的x是區域性變數的時候,外部函式的x就被遮蔽了起來,所以執行x *=x的時候,在右邊根本找不到區域性變數x的值,因此報錯。funx():
x = 5
deffuny():
x *=x
return
x
return
funy
>>>funx()()
traceback (most recent call last):
file
"", line 1, in
funx()()
file
"", line 4, in
funy
x *=x
unboundlocalerror: local variable 'x
' referenced before assignment
在python3以前並沒有直接的方案進行解決,只能間接的通過容器型別來存放,因為容器型別不是放在棧裡,所以不會被『遮蔽』掉。
>>> def在python3裡有了改進。如果希望在內部函式裡可以修改外部函式裡的區域性變數的值,用關鍵字nonlocal。funx():
x = [5]
deffuny():
x[0] *=x[0]
return
x[0]
return
funy
>>>funx()()
25
>>> def擴充套件閱讀-->遊戲中的移動角色:閉包在實際開發中的作用:(位址是:funx():
x = 5
deffuny():
nonlocal x
x *=x
return
x
return
funy
>>>funx()()
25
四、課時20課後習題及答案
內嵌函式和閉包
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函式定義的時候,出現...
L20函式 內嵌函式和閉包
global關鍵字 如果函式內部試圖修改全域性變數,python會自己遮蔽 shadowing count 5 def myfun count 10 print 10 myfun 10 print count 5加入global關鍵字 宣告函式內的該變數是全域性變數 def myfun global...
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 函式的返回...