7.1 獲取所有函數參數
在 Python 中,有幾個很方便的方法可以在函數內部獲取傳入的所有參數。讓我們來看看吧。
使用 *args
*args 允許在函數中傳入可變數量的 位置參數(一般參數)。這些參數 會被打包成一個 tuple,並可以在函數內部進行處理。
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
解釋
函數 print_numbers 接受任意數量的 位置參數,這些參數被打包成一個 tuple args。我們可以在函數內使用 for 循環來迭代這些參數。
優點
- 靈活性: 可以傳入任意數量的參數到函式。
- 通用性: 可以用於參數數量不定的函式。
使用 **kwargs
**kwargs 允許在函數中傳入可變數量的命名參數。這些參數會被 打包成一個字典,並可以在函數內部進行處理。
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
解釋
函數 print_person_info 接受任意數量的命名參數,這些參數被打包成一個字典 kwargs。我們可以使用字典的 items() 方法來迭代這些參數。
優點
- 靈活性: 可以傳入任意數量的命名參數到函式。
- 可讀性: 使用命名參數可以使函數調用更具可讀性。
7.2 固定參數類型
僅位置參數
在 Python 3.8 及以上版本中,可以定義函數僅接受位置參數,即只能按位置傳入參數。這可以通過在函數定義中使用 符號 / 來實現。
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # 輸出: Hello, Alice!
greet("Alice", greeting="Hi") # 輸出: Hi, Alice!
# greet(name="Alice") # 錯誤: TypeError
解釋
函數 greet 接受一個參數 name,這個參數只能按位置傳入。參數 在 / 前 只能按位置傳入。
這種方式限制了參數的傳遞方式,提升了可讀性並避免了錯誤。
僅命名參數 (Keyword-Only Arguments)
同樣地,也可以定義僅能通過名稱傳入的函數參數。這可以通過在函數定義中使用 符號 * 來實現。
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # 輸出: Hello, Alice!
greet(name="Alice", greeting="Hi") # 輸出: Hi, Alice!
# greet("Alice") # 錯誤: TypeError
函數 greet 接受一個參數 name,這個參數只能按名稱傳入。參數 在 * 之後 只能按名稱傳入。
這種方式要求明確指定參數名稱,提升了代碼的可讀性。
結合位置及命名參數
同樣地,也可以結合位置及命名參數以達到最大的靈活性。
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # 輸出: Hello, Alice!
greet("Alice", greeting="Hi") # 輸出: Hi, Alice!
# greet(name="Alice") # 錯誤: TypeError
函數 greet 接受一個只能按位置傳入的參數 name,以及一個命名參數 greeting,它必須按名稱傳入。使用 / 和 * 可以結合位置及命名參數。
所有三種情況的完整示例:
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# 以不同參數調用函數
full_example(1, 2, 3, 4, e=5, f=6) # 所有參數均正確傳入
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # 錯誤: TypeError
說明
- 僅位置參數:
a和b必須按位置傳入。 - 一般位置或命名參數:
c和d可以按位置或名稱傳入。 - 僅命名參數:
e和f必須按名称傳入。
GO TO FULL VERSION