本文為 Python Software Foundation -->Python 3.12.6 說明文件 -->Python教學文件 --> 4. 深入了解流程控制 -->4.8. 深入了解函式定義 -->4.8.4. 任意引數列表 (Arbitrary Argument Lists) ~ 4.9. 間奏曲:程式碼風格 (Coding Style) 繁體中文版導讀文章
續上篇
定義函式時使用的引數 (argument) 數量是可變的。總共有三種可以組合使用的形式。
有個較不常用的選項,是規定函式被呼叫時,可以使用任意數量的引數。這些引數會被包裝進一個 tuple 中(詳見 Tuples 和序列 (Sequences))。在可變數量的引數之前,可能有零個或多個普通引數:
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))
通常,這些 variadic(可變的)引數會出現在參數列表的最末端,這樣它們就可以把所有傳遞給函式的剩餘輸入引數都撈起來。出現在 *args 參數後面的任何參數必須是「僅限關鍵字」引數,意即它們只能作為關鍵字引數,而不能用作位置引數。
當引數們已經存在一個 list 或 tuple 裡,但為了滿足一個需要個別位置引數的函式呼叫,而去拆解它們時,情況就剛好相反。例如,內建的 range() 函式要求分開的 start 和 stop 引數。如果這些引數不是分開的,則要在呼叫函式時,用 * 運算子把引數們從 list 或 tuple 中拆解出來:
同樣地,dictionary(字典)可以用 ** 運算子傳遞關鍵字引數 **:
lambda 關鍵字用於建立小巧的匿名函式。
lambda a, b: a+b 函式返回兩個引數的和。Lambda 函式可用於任何需要函式物件的地方。在語法上,它們被限定只能是單一運算式。在語義上,它就是一個普通函式定義的語法糖 (syntactic sugar)。與巢狀函式定義一樣,lambda 函式可以從包含它的作用域中引用變數:
上面的例子用 lambda 運算式回傳了一個函式。另外的用法是傳遞一個小函式當作引數:
以下是關於說明文件字串內容和格式的慣例。
第一行都是一段關於此物件目的之簡短摘要。為保持簡潔,不應在這裡明確地陳述物件的名稱或型別,因為有其他方法可以達到相同目的(除非該名稱剛好是一個描述函式運算的動詞)。這一行應以大寫字母開頭,以句號結尾。
文件字串為多行時,第二行應為空白行,在視覺上將摘要與其餘描述分開。後面幾行可包含一或多個段落,描述此物件的呼叫慣例、副作用等。
Python 剖析器 (parser) 不會去除 Python 中多行字串的縮排,因此,處理說明文件的工具應在必要時去除縮排。這項操作遵循以下慣例:在字串第一行之後的第一個非空白行決定了整個說明文件字串的縮排量(不能用第一行的縮排,因為它通常與字串的開頭引號們相鄰,其縮排在字串文本中並不明顯),然後,所有字串行開頭處與此縮排量「等價」的空白字元會被去除。不應出現比上述縮進量更少的字串行,但若真的出現了,這些行的全部前導空白字元都應被去除。展開 tab 鍵後(通常為八個空格),應測試空白字元量是否等價。
下面是多行說明字串的一個範例:
函式註釋是選擇性的元資料(metadata)資訊,描述使用者定義函式所使用的型別(更多資訊詳見 PEP 3107 和 PEP 484)。
註釋以 dictionary(字典)的形式存放在函式的 annotations 屬性中,且不會影響函式的任何其他部分。參數註釋的定義方式是在參數名稱後加一個冒號,冒號後面跟著一個對註釋求值的運算式。回傳註釋的定義方式是在參數列表和 def 陳述式結尾的冒號中間,用一個 -> 文字接著一個運算式。以下範例註釋了一個必要引數、一個選擇性引數,以及回傳值:
現在你即將要寫更長、更複雜的 Python 程式,是時候討論一下編碼樣式了。大多數語言都能以不同的樣式被書寫(或更精確地說,被格式化),而有些樣式比其他的更具可讀性。能讓其他人輕鬆閱讀你的程式碼永遠是一個好主意,而使用優良的編碼樣式對此有極大的幫助。
對於 Python,大多數的專案都遵循 PEP 8 的樣式指南;它推行的編碼樣式相當可讀且賞心悅目。每個 Python 開發者都應該花點時間研讀;這裡是該指南的核心重點: