CodeGym /課程 /Python SELF TW /進階函式參數處理

進階函式參數處理

Python SELF TW
等級 14 , 課堂 3
開放

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

說明

  • 僅位置參數: ab 必須按位置傳入。
  • 一般位置或命名參數: cd 可以按位置或名稱傳入。
  • 僅命名參數: ef 必須按名称傳入。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION