理解 Python 函數中的 / 與 * 用法

更新日期: 2024 年 11 月 16 日

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:只能用位置引數傳遞。
  • keyreverse:只能用關鍵字引數傳遞。

使用範例

sorted([3, 1, 2], key=lambda x: x, reverse=True)
# 正確,使用位置引數和關鍵字引數

sorted(iterable=[3, 1, 2])  
# 錯誤,TypeError: sorted() takes positional-only arguments: 'iterable'

結語

Python 函數中的 /* 為開發者提供了更精細的參數控制。

/ 用於限制參數只能用位置引數,* 則要求參數必須用關鍵字引數。

這種設計不僅提升了程式碼的可讀性,還能防止引數名稱的衝突。

在日常開發中,合理使用這些特性可以讓函數設計更為清晰、健壯。

Similar Posts