1. 程式人生 > >第020講:函式:內嵌函式和閉包 | 學習記錄(小甲魚零基礎入門學習Python)

第020講:函式:內嵌函式和閉包 | 學習記錄(小甲魚零基礎入門學習Python)

(標答出處: 魚C論壇)
《零基礎入門學習Python》

測試題:

0.如果希望在函式中改變全域性變數的值,應該使用什麼關鍵字?

global

1.在巢狀的函式中,如果希望在內部函式修改外部函式的區域性變數,應該使用什麼關鍵字?

  nonlocal

2.python的函式可以巢狀,但是要注意一下訪問的作用域問題哦,請問一下程式碼存在什麼問題?

   def outside():
         print('I am outside!')
         def inside():
               print('I am inside!')
   
   inside()

outside函式可以呼叫inside函式,但是不能直接從從外面或者別的函式體裡呼叫

3.請問為什麼程式碼A沒有報錯,但是程式碼B卻報錯了?贏如何修改?

#程式碼A

def outside():
    var = 5
    def inside():
        var = 3
        print(var)
    inside()
outside()

#程式碼B

def outside():
    var = 5
    def inside():
        print(var)
        var = 3
    inside()
outside()
 

因為程式碼B中,local variable ‘var’ referenced before assignment,說的是變數var沒有被定義就拿來使用,所以報錯
outside()函式中有一個var,inside()函式中也有一個var,python為了保護變數的作用域,故將outside()的var變數遮蔽起來,因此此時是無法訪問到外層的var變數的

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

def funOut():
      def funIn():
            print('賓果!你成功訪問到我啦!')
      return funIn()

funOut(),因為返回的是funIn()函式

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

def funOut():
      def funIn():
            print('賓果!你成功訪問到我啦!')
      return funIn

這裡需要用funOut()()訪問
或者go = funOut() ,然後訪問go()

6.以下是閉包的一個例子,請你目測會列印什麼內容?

def funX():
    x=5
    def funY():
        nonlocal x
        x+=1
        return x
    return funY
a=funX()
print(a())
print(a())
print(a())

會列印:
6
7
8
當a=funX()的時候,只要a變數沒有被重新賦值,funX()就沒有被釋放,也就是說區域性變數x就沒有被重新初始化,
所以當全域性變數不適用的時候,可以考慮使用閉包更穩定和安全

動動手:
0.統計下邊這個長字串中各個字元出現的次數並找到小甲魚送給大家的一句話

str1 = '拷貝過來的字串'
list1=[]
for each in str1:
    if each not in list1:
        if each == '\n':
            print('\\n',str1.count(each))
        else:
            print(each,str1.count(each))
        list1.append(each)

1.請用已經學過的只是編寫程式,找出小甲魚藏在下邊這個長字串中的密碼,密碼的埋藏點符合以下規律:
a)每位密碼為單個小寫字母
b)沒為密碼的左右兩邊均有且只有三個大寫字母

str1='拷貝過來的字串'
countA=0
countB=0
countC=0
length=len(str1)
for i in range(length):
    if str1[i]=='\n':
        cotinue
    if str1[i].isupper():
        if countB==1:
            countC +=1
            countA=0
        else:
            countA+=1
        continue
    if str1[i].islower() and countA==3:
        countB=1
        countA=0
        target=i
        continue
    if str1[i].islower() and countC==3:
        print(str1[target],edn='')