<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### 4.2.4 小結:函數的定義與調用 通過前面的例子,讀者應該已經非常熟悉 Python 中函數定義的語法。在此總結如下: ``` def <函數名>(<形式參數>): <函數體> ``` 其中函數名是標識符,命名必須符合 Python 標識符的規定;形式參數是用逗號分隔的變量名序列(可以為空)。函數體是語句序列,左端必須縮進一些空白。 一旦定義了一個函數,就可以在程序的任何地方調用這個函數。函數調用的語法如下: ``` <函數名>(<實際參數>) ``` 其中實際參數可以是表達式,個數必須和形式參數相同。注意,這里列出的函數調用語法實 際上適用于沒有返回值的函數,即 4.1.3 節中提到的“過程”。4.2.6 小節會討論具有返回值 的函數。 當 Python 遇到一個函數調用時,將通過四個步驟來處理這個調用。假設程序 P 現在執 行到了一個函數調用 f(a),則這四個步驟是: (1)調用者 P 在調用點暫停執行(術語也稱為 P 掛起); (2)函數 f 的形式參數被賦予實際參數 a 的值; (3)執行 f 的函數體; (4)f 執行完畢后,控制返回到 P 中調用點的下一條語句。 下面我們以程序 4.6 為例,具體描述函數調用過程。為了方便閱讀,將程序 4.6 的主函 數 main 羅列在下面,整個程序從 main 開始執行。 ``` def main(): star_treetop() treetrunk() print caret_treetop() treetrunk() ``` 當 Python 執行到 star_treetop()時,main 暫停執行,控制轉到 star_treetop。 因為沒有參數傳遞問題,所以直接執行 star_treetop 的函數體。圖 4.1 描述了這個函數 調用的控制轉移情況。 ![](https://box.kancloud.cn/2016-02-22_56cafcde9c1a0.png) 圖 4.1 控制從 main 轉移到 star_treetop 控制轉到 star_treetop 后執行的第一條語句又是一個函數調用 treetop("*"), 于是 Python 又暫停執行 star_treetop,而將控制轉到 treetop("*")。Python 檢查 treetop 的定義后發現它有一個形式參數 ch,于是將函數調用 treetop("*")的實際參 數"*"傳遞給形式參數 ch,這相當于在 treetop 的函數體之前增加了一條賦值語句: ``` ch = "*" ``` 參數傳遞后開始執行 treetop 的函數體。圖 4.2 展現了這時的狀態,注意 treetop內部的變量 ch 已經被賦值為"*"。 ![](https://box.kancloud.cn/2016-02-22_56cafcdeae5d9.png) 圖 4.2 控制從 star_treetop 轉移到 treetop 由于 treetop()的函數體是一系列 print 語句,沒有更多函數調用,于是 Python 順 序執行這些語句,結束后將控制返回到 treetop 調用點的下一條語句,即 star_treetop 中的第二條 treetop("*")語句,這時的情形參看圖 4.3。注意,當函數執行完畢,函數的 變量所占用的存儲空間將被 Python 收回,任何變量都不可能將數據保持到下一次執行函數, 故圖 4.3 中 ch 顯示為未賦值狀態。 ![](https://box.kancloud.cn/2016-02-22_56cafcdec4e4b.png) 圖 4.3 控制從 treetop 返回 star_treetop 接下來執行 star_treetop 的第二條 treetop("*"),其過程和前面一條完全一樣, 我們就不作圖演示了。現在,當控制從 treetop 再次返回 star_treetop 時,此函數也 執行完畢,故控制又返回到 main 函數中調用點的下一條語句。如圖 4.4 所示。 ![](https://box.kancloud.cn/2016-02-22_56cafcdee013d.png) 圖 4.4 控制從 star_treetop 返回 main 控制返回 main 后執行的是第二條語句 treetrunk(),這又是一個函數調用。于是 main 再次暫停執行,控制轉移到函數 treetrunk。treetrunk 執行完畢控制返回 main, 執行第三條語句 print,輸出一個空行后執行函數調用 caret_treetop()。這和前面 star_treetop()的執行過程是類似的,控制轉移到 caret_treetop 的函數體后遇到的 是 treetop("^"),這次傳遞給形式參數 ch 的值是字符"^",圖 4.5 表示了此時的狀態。 ![](https://box.kancloud.cn/2016-02-22_56cafcdef0add.png) 圖 4.5 控制從 caret_treetop 轉到 treetop 并傳遞不同實際參數 此后的執行過程與上述類似,我們不再逐一說明。當程序最后一行的調用 treetrunk 執行完畢,控制返回到 main 時到達程序末尾,于是整個程序結束。其實,main 本身也是一個函數,程序 4.6 的最后一行就是對 main 的調用。由于 main 是頂層模塊,調用并執行 main 后控制只能返回給 Python——所以整個程序執行完畢后我們看到的是熟悉的“&gt;&gt;&gt;”。 以上我們通過例子描述了 Python 的函數定義和調用。還要說明一點,函數定義中提到 形式參數可以是用逗號分隔的變量名序列。對于有多個形式參數的函數,調用時一定要注意 形式參數與實際參數的匹配。簡單的做法是按位置匹配,即調用時提供的第一個實際參數賦 值給第一個形式參數,第二個實際參數賦值給第二個形式參數,依此類推。 作為例子,我們再來研究用字符畫樹冠的問題。樹冠是由兩個三角形圖案組成的,程序 4.2 或程序 4.6 中,函數 treetop 的功能就是用字符畫三角形圖案,只不過程序 4.2 固定用 字符"*"畫畫,程序 4.6 可以用任意字符畫畫。觀察 treetop 的函數體,可見圖案是由多 條 print 語句所打印的字符串拼成的,并且每條 print 所打印的字符串很有規律:每行中 "*"的個數是自頂向下分別是 1、3、5、7,而左邊留的空格數自頂向下分別是 3、2、1、0。 對這些數字做一點分析,很容易得出規律:設樹冠最寬處有 w 個"*"字符,則當某一行上要 畫 c 個"*"時,該行左邊留的空格數就是(w - c) / 2。根據這個規律,我們定義一個新的 treetop 函數,它具有兩個參數:一個是畫圖所用字符 ch,另一個是樹冠寬度 width(為 對稱起見應該用奇數,此前例子都固定為 7)。顯然這個新的 treetop 函數更加通用化,可 以用任意字符畫任意寬度的樹冠。 ``` def treetop(ch,width): for c in range(1,width+1,2): print ((width–c)/2) * " " + c * ch ``` 下面我們在 Python 交互環境下定義這個函數,然后做一些測試。結果如下: ``` >>> treetop("*",7) * *** ***** ******* >>> treetop("@",9) @ @@@ @@@@@ @@@@@@@ @@@@@@@@@ >>> treetop(11,"A") Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> treetop(11,"A") File "<pyshell#2>", line 2, in treetop for c in range(1,width+1,2): TypeError: cannot concatenate 'str' and 'int' objects ``` 從上例可知,由于函數 treetop 有兩個形式參數,因此調用該函數時必須傳遞兩個實 際參數與之匹配。參數傳遞的效果相當于在 treetop 的函數體前面執行了兩條賦值語句: ``` ch = ... width = ... ``` 如果實際參數與形式參數不匹配,函數執行就可能出錯,如上例中的 treetop(11,"A")。 更嚴重的是函數執行似乎沒有出錯,但參數的錯誤匹配實際上導致計算結果完全沒有意義。 例如我們定義一個顯示身高體重信息的函數,然后調用之: ``` >>> def printInfo(height,weight): print "Height:",height print "Weight:",weight >>> printInfo(80,1.80) Height: 80 Weight: 1.8 ``` 可見,由于調用時參數傳遞不匹配,函數雖然能夠執行,但結果無意義。 關鍵字參數 函數調用時的參數傳遞通常采用上述“按位置匹配”的方式,但 Python 還提供另一種 參數傳遞方式——關鍵字參數。關鍵字參數形如“&lt;形參名&gt; = &lt;實參值&gt;”,即通過形式參數 的名字來指示為哪個形參傳遞什么值。例如: ``` >>> treetop(width = 11,ch = "A") A AAA AAAAA AAAAAAA AAAAAAAAA AAAAAAAAAAA ``` 關鍵字參數在某些場合用起來更方便。例如,如果一個函數有很多參數,但是調用時只 想為個別參數傳遞值,而其他參數采用缺省值,這是采用關鍵字參數就是必然的選擇。下面 是一個簡單的例子: ``` >>> def f(a,b=7,c=2): print a,b,c >>> f(2005) 2005 7 2 >>> f(1927,8,1) 1927 8 1 >>> f(1921,c=1) 1921 7 1 ``` 注意,這個例子同時說明了如何為函數參數指定缺省值。
                  <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>

                              哎呀哎呀视频在线观看