課時20 內嵌函式和閉包

2022-08-04 11:18:15 字數 3944 閱讀 1640

目錄:

一、global關鍵字

二、內嵌函式

三、閉包

四、課時20課後習題及答案

一、global關鍵字

全域性變數的作用域是整個模組(整個**段),也就是**段內所有的函式內部都可以訪問到全域性變數。但是要注意一點,在函式內部僅僅去訪問全域性變數就好,不要試圖去修改它。

因為那樣的話,python會使用遮蔽的方式」保護「全域性變數:一旦函式內部試圖修改全域性變數,python就會在函式內部自動建立乙個名字一模一樣的區域性變數,這樣修改的結果只會修改到區域性變數,而不會影響到全域性變數。看下面的例子:

>>> count=5

>>> def

myfun():

count = 10

print

(count)

>>>myfun()

10>>>count

5

如果覺得有必要在函式中去修改這個全域性變數,那麼你不妨可以使用global關鍵字來達到目的!修改程式如下:

>>> count=5

>>> def

myfun():

global

count

count = 10

print

(count)

>>>myfun()

10>>>count

10

二、內嵌函式python函式定義是可以巢狀的,也就是允許在函式的內部建立另外乙個函式,這種函式叫做內嵌函式或者內部函式。舉個例子:

>>> def

fun1():

print("

fun1()正在被呼叫")

deffun2():

print("

fun2()正在被呼叫")

fun2()

>>>fun1()

fun1()正在被呼叫

fun2()正在被呼叫

值得注意的是:就是內部函式整個作用域都在外部函式之內。

另外需要注意的地方:如果在fun1()外部試圖呼叫內部函式fun2(),就會報錯:

>>>fun2()

traceback (most recent call last):

file

"", line 1, in

fun2()

nameerror: name

'fun2'is

not defined

三、閉包閉包是函式程式設計的乙個重要的語法結構,函式式程式設計是一種程式設計正規化,著名的函式式程式語言就是lisp語言。

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

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

這個錯誤資訊跟之前講解全域性變數的時候基本一樣,python認為在內部函式的x是區域性變數的時候,外部函式的x就被遮蔽了起來,所以執行x *=x的時候,在右邊根本找不到區域性變數x的值,因此報錯。

在python3以前並沒有直接的方案進行解決,只能間接的通過容器型別來存放,因為容器型別不是放在棧裡,所以不會被『遮蔽』掉。

>>> def

funx():

x = [5]

deffuny():

x[0] *=x[0]

return

x[0]

return

funy

>>>funx()()

25

在python3裡有了改進。如果希望在內部函式裡可以修改外部函式裡的區域性變數的值,用關鍵字nonlocal。

>>> 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 函式的返回...