小甲魚Python第020講函數:內嵌函數和閉包 | 課后測試題及參考答案


測試題:

0.如果希望在函數中修改全局變量的值,應該使用什么關鍵字?

  global關鍵字

1 count = 5
2 def Myfun():
3     global count
4     count =10
5     print(count)
6 Myfun()
7 print(count)

 

1.在嵌套函數中,如果希望在內部函數修改外部函數的局部變量,應該是用什么關鍵字?

  nonlocal關鍵字

1 def Fun1():
2     x = 5
3     def Fun2():
4         nonlocal x
5         x *=x
6         return  x
7     return Fun2()
8 print(Fun1())

 

2.Python的函數可以嵌套,但是要注意訪問的作用域問題,請問以下代碼存在什么問題呢?

1 def outside():
2     print("I am outside!")
3     def inside():
4         print("I am inside!")
5 inside()

   使用嵌套函數要注意一點就是作用域的問題,Inside()函數是內嵌在outside()函數中的,所以inside()只能outside()可以調用,在外邊或者別的函數體里是無法對其進行調用的。  

1 def outside():
2     print("I am outside!")
3     def inside():
4         print("I am inside!")
5     inside()
6 outside()

 

3.請問為什么代碼A沒有報錯,但是代碼B卻報錯了?應該如何修改?

代碼A:

1 def outside():
2     var = 5
3     def inside():
4         var = 3
5         print(var )
6     inside()
7 outside()

 

代碼B:

1 def outside():
2     var = 5
3     def inside():
4         print(var )
5         var = 3
6     inside()
7 outside()

   代碼B中的outside()函數里有一個var變量,但是要注意的是,內嵌函數inside()也有一個同名的變量,Python為了保護變量的作用於,故將outside()的var變量屏蔽起來,因此此時是無法訪問到外層的var變量。

1 def outside():
2     var = 5
3     def inside():
4         nonlocal  var
5         print(var )
6         var = 3
7     inside()
8 outside()

 

4.請問如何訪問FunIn()呢?

1 def funOut():
2     def funIn():
3         print("賓果!恭喜成功訪問到啦~")
4     return funIn()

   運行funOut()

5.請問如何訪問FunIn()呢?

1 def funOut():
2     def funIn():
3         print("賓果!恭喜成功訪問到啦~")
4     return funIn

   方法一:調用funout()()

  方法二:g = funout()

      運行g()

6.以下是“閉包”的一個例子,請你目測下會打印什么內容?

 1 def funX():
 2     x=5
 3     def funY():
 4         nonlocal  x
 5         x+=1
 6         return x
 7     return funY
 8 a=funX()
 9 print(a())
10 print(a())
11 print(a())

   輸出結果:

6

7

8

 

有些魚油可能會比較疑惑,這……怎么跟全局變量一樣了?局部變量x不是應該在每次調用的時候都重新初始化了嗎?!

其實大家仔細看看就明白了,當a = funX()的時候,只要a變量沒有被重新賦值,funX()就沒有被釋放,也就是說局部變量x就沒有被重新初始化。
所以當全局變量不適用的時候,可以考慮使用閉包更穩定和安全,你還可以參考 -> 游戲中的角色移動:閉包在實際開發中的作用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM