<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                **函數作為返回值** 在高階函數那一講,我們已經知道了,高階函數可以接受函數作為參數,其實函數也可以作為結果值返回。 在函數嵌套那一講我們講了這么一個例子 ~~~ #!/usr/bin/env python3 # -*- coding:utf-8 -*- def myAdd(a,b): '''兩數求和悄悄加一''' sum = a + b def innerAdd(num): return num + 1 sum = innerAdd(sum) return sum print(myAdd(1,2)) ~~~ 我們直接把兩數求和再加一的結果返回了,如果不需要立刻知道結果,而是在后面的代碼中,根據需要再計算怎么辦?所以就不能直接返回結果了,而是返回計算的函數。 ~~~ #!/usr/bin/env python3 # -*- coding:utf-8 -*- def myAdd(a,b): '''兩數求和悄悄加一''' sum = a + b def innerAdd(): return sum + 1 return innerAdd f = myAdd(1,2) #第一次打印 print(f) #第二次打印 print(f()) #第三次打印 print(myAdd(1,2) == myAdd(1,2)) ~~~ 運行結果 ~~~ airvip@airvip$ ./test.py #第一次打印結果 <function myAdd.<locals>.innerAdd at 0x7f5b2a1ac6a8> #第二次打印結果 4 #第三次打印結果 False ~~~ 當我們調用 myAdd() 時,返回的并不是最終的結果,而是一個函數,再調用函數 f 時,才真正計算得到結果。 需要特別注意第三次打印的結果為 False 假。 在這個例子中,我們在函數 myAdd 中又定義了函數 innerAdd,內部函數 innerAdd 可以使用用外部函數 myAdd 的參數和局部變量,當 myAdd 返回 innerAdd 函數時,其調用的參數和變量都已經保存在返回的函數中,這種方式稱為“閉包(Closure)”。 另外當一個函數返回了一個函數后,其內部的局部變量還被新函數使用中,返回的函數并沒有立刻執行,只有調用了之后才執行,我們來看下面這個例子。 ~~~ >>> def myAdd(a,b): ... Fl = [] ... sum = a+b ... for i in range(2): ... def innerAdd(): ... return sum + i ... Fl.append(innerAdd) ... return Fl ~~~ 在程序中每次循環都創建了一個新的函數,最后一起把創建的函數都返回了 調用,我們想要的結果是 3,4 ,然而真實結果卻是: ~~~ >>> f1,f2 = myAdd(1,2) >>> f1() 4 >>> f2() 4 ~~~ 結果全為 4 ,這是為什么呢?因為返回的函數引用了變量 i,它并沒有立刻執行。等到所有函數都返回時,它們使用的變量 i 已經都變成了 1,所以結果就都是 4 了。 那如何解決呢?想辦法將傳入函數的參數綁定在函數上無法修改,這就需要再創建一個函數。 ~~~ >>> def myAdd(a,b): ... Fl = []; ... sum = a+b ... def center(i): ... def innerAdd(): ... return sum + i ... return innerAdd ... for i in range(2): ... Fl.append(center(i)) ... return Fl ... ~~~ 再次調用 ~~~ >>> f1,f2 = myAdd(1,2) >>> f1() 3 >>> f2() 4 ~~~ 總結: 每次調用以函數作為返回值的函數時,即便傳遞的參數一模一樣,返回的結果也不同。 在編寫返回函數時,一定不要使用任何后續操作會發生變化的變量。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看