本文為 python 打包與解構 系列文,第 3 篇:
- 理解 Python 函數中的預設值機制
- Python 函數參數詳解:位置引數與關鍵字引數的新手指南
- 理解 Python 函數中的 / 與 * 用法 👈進度
- Python 串列開箱(Unpacking)詳解:新手指南
- Python 字典的開箱(**)詳解:新手指南
Python 提供了多種方式來定義函數的參數,提升了函數的靈活性和可讀性。
其中,/ 和 * 是兩個特殊的分隔符,用於限定參數的傳遞方式:是只能用位置引數還是只能用關鍵字引數。
這些用法在提升函數的表達力,和避免參數混淆方面尤為重要。
本文將詳細解釋這兩者的作用和應用。
/:限定參數為「只能用位置引數」
在函數定義中,使用 / 表示 / 前面的所有參數只能通過位置引數傳遞,而不能使用關鍵字引數。
語法格式
def 函數名稱(位置參數1, 位置參數2, /, 其他參數):
# 函數內容/左側的參數:必須使用位置引數。/右側的參數:可以自由選擇使用位置引數或關鍵字引數。
範例:限定位置引數
def hi(a, b, /, c, d, e):
print(a, b, c, d, e)正確使用
hi(1, 2, 3, 4, 5) # 輸出: 1 2 3 4 5錯誤使用
hi(a=1, b=2, c=3, d=4, e=5)
# TypeError: hi() got some positional-only arguments passed as keyword arguments: 'a, b'為什麼需要 /?
/ 用於函數的設計目的是避免引數名稱,與內建函數或未來可能的關鍵字衝突。
例如:
def sum(x, y, /): # 避免傳入關鍵字引數
return x + y
sum(1, 2) # 正常使用
sum(x=1, y=2) # 錯誤,會引發 TypeError*:限定參數為「只能用關鍵字引數」
在函數定義中,使用 * 表示 * 後面的所有參數只能通過關鍵字引數傳遞,而不能使用位置引數。
語法格式
def 函數名稱(*, 關鍵字參數1, 關鍵字參數2):
# 函數內容*後的參數:必須使用關鍵字引數。
範例:限定關鍵字引數
def greet(name, *, greeting="Hello"):
print(f"{greeting}, {name}!")正確使用
greet("Alice", greeting="Hi") # 輸出: Hi, Alice!
greet("Alice") # 輸出: Hello, Alice!錯誤使用
greet("Alice", "Hi")
# TypeError: greet() takes 1 positional argument but 2 were given綜合應用:結合 / 和 *
Python 函數中可以同時使用 / 和 *,進一步限定參數的使用方式。
例如:
def sorted(iterable, /, *, key=None, reverse=False):
# 內建 sorted 函數的原型
passiterable:只能用位置引數傳遞。key和reverse:只能用關鍵字引數傳遞。
使用範例
sorted([3, 1, 2], key=lambda x: x, reverse=True)
# 正確,使用位置引數和關鍵字引數
sorted(iterable=[3, 1, 2])
# 錯誤,TypeError: sorted() takes positional-only arguments: 'iterable'結語
Python 函數中的 / 和 * 為開發者提供了更精細的參數控制。
/ 用於限制參數只能用位置引數,* 則要求參數必須用關鍵字引數。
這種設計不僅提升了程式碼的可讀性,還能防止引數名稱的衝突。
在日常開發中,合理使用這些特性可以讓函數設計更為清晰、健壯。