理解 Python 函數中的 / 與 * 用法
更新日期: 2024 年 11 月 16 日
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 函數的原型
pass
iterable
:只能用位置引數傳遞。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 函數中的 /
和 *
為開發者提供了更精細的參數控制。
/
用於限制參數只能用位置引數,*
則要求參數必須用關鍵字引數。
這種設計不僅提升了程式碼的可讀性,還能防止引數名稱的衝突。
在日常開發中,合理使用這些特性可以讓函數設計更為清晰、健壯。