<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 功能強大 支持多語言、二開方便! 廣告
                # Python 函數 > 原文: [https://javabeginnerstutorial.com/python-tutorial/python-function/](https://javabeginnerstutorial.com/python-tutorial/python-function/) 現在,我們學習了 Python 編程的基礎知識:變量,集合和循環。 如果您按照示例和教程進行操作,您可能會覺得有時我們會使用過多的代碼,因此可以利用它。 但是也許您不知道該怎么做。 大多數時候,解決方案是引入函數。 我們遇到了其他模塊的函數,就像字符串的`isupper()`或`random`模塊的`choice()`一樣。 如果您學習過數學,那么您已經知道函數。 數學家可以與他們一起做非常討厭的事情,但是程序員也可以。 函數的目的是產生僅由傳遞給函數的參數確定的結果。 在編程語言中,我們可以將函數視為黑盒,在其中我們發送定義數量的參數(0 和更多),然后該函數返回結果。 在 Python 中,即使您沒有顯式編寫或查看`return`語句,函數始終會返回結果。 這意味著,如果您知道另一種編程語言(例如 C++ 或 Java),那么您將了解`void`函數。 在 Python 中沒有這種類型-但是,當我告訴您返回值時,我們將在本文后面看到。 ## 定義函數 使用`def`語句創建一個函數。 通用語法如下所示: ```py def function_name(param_list): function_body statements ``` 參數列表包含零個或多個元素。 如果您調用函數,那么您說的是參數而不是參數,但這是術語,在我看來,即使您調用函數也只說參數也是可以的。 如果您不將其聲明為可選參數,則這些參數是必需的。 我們將在下一節中查看可選參數。 每次調用函數時,都會執行其主體中的語句。 當然,您可以使用函數體內的`pass`語句不執行任何操作-但在這種情況下,`pass`語句也將執行。 如您所知:函數必須在其主體中至少包含一個語句。 沒有它,您會得到一個錯誤: ```py >>> def no_body_function(): ... File "<stdin>", line 2 ``` ```py ^ IndentationError: expected an indented block ``` 嗯,這個錯誤消息并不是最能說明問題的,但是在這種情況下,編譯器缺少縮進的塊-至少有一個針對函數體的語句。 因此,我們編寫一個簡單的函數,它是交換計算器。 它獲得兩個參數:值和匯率,并返回更改后的值(值乘以匯率)。 ```py def exchange(value, rate): return value*rate ``` 因此,每次定義函數時,請確保您具有縮進的主體。 如果您在 Python 的交互式解釋器中遵循本文,則定義將如下所示: ```py >>> def exchange(value, rate): ...???? return value*rate ... ``` 正如我之前提到的,您也可以使用沒有`return`語句的函數。 但是,大多數情況下,您不會使用這些函數,但是為了簡潔起見,我們在這里也看一個示例: ```py >>> def no_return(): ...???? print("This function has no return statement") ... ``` ## 調用函數 我認為這很容易。 您已經知道如何調用函數,但讓我們快速進行介紹。 如果您有一個函數定義,則可以通過傳遞正確的參數作為參數來調用它,這很不錯。 正如我之前告訴您的,我們已經調用了函數。 我們首先調用的基本函數是`print()`。 您可以不帶任何參數地調用它,在這種情況下,它將在輸出中輸出換行符(空行)。 另外,我們可以傳遞任意數量的參數,每個參數之間用逗號(`,`)分隔,它們也將被打印到輸出中。 現在,我們調用上一節中定義的兩個函數。 ```py >>> no_return() This function has no return statement >>> exchange(123, 1.12) 137.76000000000002 ``` 如您所見,調用函數沒有什么復雜的。 ## 返回值 之前我曾說過,函數會返回值-即使您未顯式編寫`return`語句。 現在是時候驗證我的語句了,因此我將向您展示即使`no_return()`函數也返回一個值,并且該值為`None`。 要查看函數的`return`語句,我們只需將函數調用包裝到`print()`函數調用中即可。 ```py >>> print(no_return()) This function has no return statement None >>> print(exchange(123,1.12)) 137.76000000000002 ``` 在這里您可以看到,即使沒有`return`語句的函數也返回`None`。 這意味著在這種情況下,您必須小心使用返回值,因為使用`None`時,僅在布爾表達式中使用它就幾乎無能為力-當然要小心。 ```py >>> result_value = no_return() This function has no return statement >>> result_value + 5 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' ``` ```py >>> if result_value == False: ...???? print("Nothing useful...") ... else: ...???? print("Wow, we have got True back!") ... Wow, we have got True back! ``` 如您在上面的示例中看到的,例如,您不能在數學運算中使用`None`,并且`None`不為`False`。 要修復示例的第二部分,我們可以像這樣更改代碼: ```py >>> if not result_value: ...???? print("Nothing useful...") ... else: ...???? print("Wow, we have got True back!") ... Nothing useful... ``` 只使用沒有任何值的`return`也是如此。 返回結果與沒有返回語句的結果相同。 為什么要這么好? 例如,如果條件求值為`true`,并且您想不返回任何內容,則希望終止函數。 自然地,您可以使用`return None`,但是更多的 pythonic 解決方案將是簡單地使用`return`。 ## 可選參數 您可以使用可選參數創建函數。 這意味著不必將這些參數傳遞給函數。 在這種情況下,將使用其默認值-如果可選參數獲得其默認值,有時會跳過語句塊。 可選參數必須遵循強制性參數,并且必須具有默認值。 當您調用函數并且不提供此參數時,將使用此值。 以前面介紹的交換函數為例。 快速提醒一下,這里是定義: ```py def exchange(value, rate): return value * rate ``` 如果我們嘗試僅使用 1 個參數(帶有值)來調用此交換函數,則會從解釋器中收到錯誤消息: ```py >>> exchange(42) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: exchange() missing 1 required positional argument: 'rate' ``` 現在,將`rate`變量設為可選,并將其默認值設置為 1,以便能夠以相同的貨幣調用此函數而無需進行任何兌換。 因此,解決方案是為函數中的`rate`參數設置默認值,并將該值設置為 1。 要查看其工作原理,我還對代碼進行了一些更改以顯示當前匯率: ```py >>> def exchange(value, rate=1): ...???? print('Current exchange rate is', rate) ...???? return value * rate ``` 現在`rate`參數是可選的,我們可以調用帶有或不帶有`rate`的函數: ```py >>> exchange(124,0.78) Current exchange rate is 0.78 96.72 >>> exchange(325,1) Current exchange rate is 1 325 >>> exchange(42) Current exchange rate is 1 42 ``` 可選參數和必需參數的順序很重要。 例如,如果我們更改順序并將`rate = 1`作為`value`之前的第一個參數添加,我們將得到一個錯誤: ```py >>> def exchange(rate=1, value): ...???? return value * rate ... File "<stdin>", line 1 SyntaxError: non-default argument follows default argument ``` 如果您考慮一下,您將了解為什么會這樣:如果我們提供一個論點,該怎么辦。 是可選的還是必需的? 好吧,口譯員無法分辨,也許您最終會得到錯誤的結果。 ## 關鍵字參數 在學習 Python 時,您可能會遇到術語“關鍵字參數”。 實際上,它們與可選參數相同:它們具有名稱和默認值。 這個名稱是關鍵字,您可以使用它為該參數分配一個新值。 讓我們再次看一下前面的示例:`rate`是函數的關鍵字參數。 由于`exchange`只有一個可選參數,因此您可以同時使用兩種參數來調用它: ```py >>> exchange(42, 1.25) 52.5 >>> exchange(42, rate=1.25) 52.5 ``` 第二種情況是我們使用關鍵字參數。 現在再來看一個示例,其中有多個可選參數,以便您了解它如何與關鍵字參數一起實際使用。 該示例將非常基礎:我們定義一個函數,該函數采用四個參數`a`,`b`,`c`,`d`并執行以下計算:`a + b – c + d`。 要使其工作,它僅需要 2 個參數,兩個是可選的。 ```py >>> def sub_sum(a, b, c=0, d=0): ...?? return a + b - c + d ... >>> sub_sum(12,33) 45 ``` 現在,我們可以選擇傳遞變量`c`和`d`的值。 如果我們已經知道為`c`提供值有兩種選擇。 ```py >>> sub_sum(12,33,0,10) 55 >>> sub_sum(12,33,d=10) 55 ``` 如您所見,不必提供所有值,在調用函數時為`d`分配值就足夠了。 這就是為什么它們被稱為“關鍵字參數”的原因。 您可能會想到:有些函數帶有很多參數,大多數時候只需要它們的默認值即可。 因此,您無需傳遞它們(因此您不必知道默認值是什么),并且可以使用關鍵字的列表中某個位置的單個參數對函數調用進行微調。 進一步講這個概念,我們可以用一種關鍵字語法調用函數,其方式是您在其他語言中無法想象的:您可以隨意對值進行排序,直到為所有必需的參數提供它們的名稱。 ```py >>> sub_sum(b=12,a=33,d=10) 55 >>> sub_sum(d=10, 8, 11) File "<stdin>", line 1 SyntaxError: positional argument follows keyword argument ``` 如您所見,如果您弄亂了順序,則不能省略必需參數的名稱。 在這種情況下,需要命名它們,以使解釋器知道您想要設置這些值。 ### 關鍵字參數的陷阱 上面我們已經看到了一種使用關鍵字參數的方法。 但是,每個硬幣都有兩個面。 分配這些默認值后,讓我們再深入一點。 它是在創建函數時完成的(因此,在解釋器解析函數定義時),而不是在調用函數時完成。 這意味著只要將不可變類型用于命名參數/關鍵字參數,我們就看不到任何區別。 但是,當我們使用可變變量(例如列表)時,可能會出現問題: ```py >>> def append_if_short(s, lst=[]): ...???? if len(s) < 4: ...???????? lst.append(s) ...???? return lst ... ``` 在上面的示例中,如果`s`的長度最大為 3,則將參數`s`附加到參數`lst`上。如果將兩個參數都傳遞給函數,這似乎很好。 但是讓我們有時調用此函數... ```py >>> append_if_short("one") ['one'] >>> append_if_short("two") ['one', 'two'] >>> append_if_short("three") ['one', 'two'] >>> append_if_short("four") ['one', 'two'] >>> append_if_short("five") ['one', 'two'] >>> append_if_short("six") ['one', 'two', 'six'] ``` 如您所見,這會導致意外的行為。 我們傳入一個字符串,并返回一個包含比預期更多的元素的列表。 但是,這還不是全部。 我們會讓事情變得更糟: ```py >>> def append_if_short(s, lst=[]): ...???? if len(s) < 4: ...???????? lst.append(s) ...???? return lst ... >>> result = append_if_short("one") >>> result ['one'] >>> result.append('five') >>> append_if_short('two') ['one', 'five', 'two'] ``` 在上面的示例中,我們向列表中添加了一個元素,該元素顯然超過了 3 個字符-這又可能導致意外行為。 要解決此問題,請更改函數定義: ```py >>> def append_if_short(s, lst=None): ...???? if lst is None: ...???????? lst = [] ...???? if len(s) < 4: ...???????? lst.append(s) ...???? return lst ... >>> result = append_if_short("one") >>> result ['one'] >>> result.append('five') >>> append_if_short('two') ['two'] ``` ## 文檔字符串 有時(我希望每次)您都會有記錄函數的沖動。 您可以使用圍繞函數定義的簡單注釋來完成此操作。 但是,您應該遵循一種常見的做法:*文檔字符串*。 這些是簡單的文檔字符串,位于函數定義之后。 它們具有特殊的三引號格式,因為它們是描述您的函數的多行字符串。 有時文檔比函數本身更長。 約定是使文檔字符串的第一行成為簡短的單行描述,然后在空白行后加上完整的描述,然后給出一些示例(如在交互式解釋器中鍵入的內容)。 因此,讓我們使用此指南并將文檔添加到我們的`append_if_short`函數中。 ```py def append_if_short(s, lst=None): """ Returns a list containing s if the length of s is smaller than 4. ``` `s`是任何字符串,`lst`是可選的列表類型參數。 如果未提供`lst`,則新的`l??st`將分配一個新的空列表。 如果`len < 4`,則將`s`附加到`lst`并返回`lst`。 ```py >>> append_if_short('one') ['one'] >>> append_if_short('two', ['one']) ['one', 'two'] >>> append_if_short('three', []) [] >>> append_if_short('four') [] """ if lst is None: lst = [] if len(s) < 4: lst.append(s) return lst ```
                  <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>

                              哎呀哎呀视频在线观看