Python 函式裡 *args 與 **kwargs有什麼好玩的?

常見的函式的輸入參數數量是固定的,而*args 和 **kwargs 不用預知輸入參數數量,使程式設計更具靈活性。

常見的函式的輸入參數數量是固定的,例如下面的代碼範例有個add函式就規定3個參數(Tle, n1, n2),不能多也不能少,欠缺靈活性。

如果預先不知道函數使用者會傳遞多少個參數,就是*args 和 **kwargs 的使用場景。


以下為一個典型的函示使用示範:

def add(Tle, n1, n2):
    print(Tle, end="")
    n= n1 + n2 
    return(n)

print(add("兩數相加為:", 2.6, 1.5))

輸出結果:

兩數相加為:4.1

*一般的函式輸入參數是固定的,在真實應用的場景缺乏彈性。

1.說明

args 是 arguments 的縮寫,表示位置參數,kwargs 是 keyword arguments 的縮寫,表示關鍵字參數。

使用 *args 和 **kwargs 可以讓函數更加靈活,適合變動數量的參數請求。

*args:

  • 允許傳遞任意數量的位置參數(Positional arguments),依照傳入函式做區別。
  • 參數在函數內部會被打包成一個元組。

**kwargs:

  • 允許傳遞任意數量的關鍵字參數(Keyword arguments),。
  • 參數在函數內部會被打包成一個字典。


注意:

一般位置參數位置參數(*args)一般關鍵字參數關鍵字參數(**kwargs)
例如: func(pos1, pos2, *args, kw1=None, kw2=None, **kwargs)


*學過C/C++的可能會將這篇用的星號”*”和指標觀念做聯想,實際上兩者是無關的。


2.示範 *args

*args 允許傳遞可變數量的位置參數給函數。這些參數會被打包成一個元組(tuple),可在函數內部進行疊代輸出。

def Ex_args(*args):
    print("arguments:", args)

    print("迴圈印出引數:", end=" ")     # arguments 為元組
    for arg in args:
        print(arg, end=" ")

# 調用函數
Ex_args(1, 2, 3, 'a', 'b', 'c')


輸出結果:

arguments: (1, 2, 3, 'a', 'b', 'c')
迴圈印出引數: 1 2 3 a b c



3.示範 **kwargs

**kwargs 允許我們傳遞可變數量的關鍵字參數給函數。這些參數會被打包成一個字典(dictionary),可在函數內部進行疊代輸出。

def Ex_kwargs(**kwargs):
    print("keyword arguments:", kwargs)  # kwargs為字典

    for key, value in kwargs.items():
        print(f"{key} = {value}" ,end=",  ")

# 調用函數
Ex_kwargs(name="葉師傅", age=37, city="台北市")


輸出結果:

keyword arguments: {'name': '葉師傅', 'age': 37, 'city': '台北市'}
name = 葉師傅  age = 37  city = 台北市



4.示範同時用 *args 和 **kwargs

同時使用 *args 和 **kwargs 來處理位置參數和關鍵字參數。

def Ex_args_kwargs(*args, **kwargs):
    print("Arguments:", args)
    print("Keyword arguments:", kwargs)

    for arg in args:
        print(f"Positional argument: {arg}")

    for key, value in kwargs.items():
        print(f"Keyword argument: {key} = {value}")

# 調用函數
Ex_args_kwargs(10.1, 20.1, 30.1, name="葉師傅", age=37, city="台北市")


輸出結果:

Arguments: (10.1, 20.1, 30.1)
Keyword arguments: {'name': '葉師傅', 'age': 37, 'city': '台北市'}
Positional argument: 10.1
Positional argument: 20.1
Positional argument: 30.1
Keyword argument: name = 葉師傅
Keyword argument: age = 37
Keyword argument: city = 台北市



5.加入返回值

def Ex_args_kwargs(*args, **kwargs):
    print("Arguments:", args)
    print("Keyword arguments:", kwargs)

    for arg in args:
        print(f"Positional argument: {arg}")

    for key, value in kwargs.items():
        print(f"Keyword argument: {key} = {value}")

    # 傳回結果
    return args, kwargs

# 調用函數並接收返回值
positional_args, keyword_args = Ex_args_kwargs(1, 2, 3, name="葉師傅", age=37, city="台北市")

# 輸出返回值
print("返回 positional arguments:", positional_args)
print("返回 keyword arguments:", keyword_args)

函數 Ex_args_kwargs 接收任意數量的位置參數(args)和關鍵字參(*kwargs)。
函數返回這些參數作為結果,位置參數返回一個元組,關鍵字參數返回一個字典。


輸出結果:

Arguments: (1, 2, 3)
Keyword arguments: {'name': '葉師傅', 'age': 37, 'city': '台北市'}
Positional argument: 1
Positional argument: 2
Positional argument: 3
Keyword argument: name = 葉師傅
Keyword argument: age = 37
Keyword argument: city = 台北市
返回 positional arguments: (1, 2, 3)
返回 keyword arguments: {'name': '葉師傅', 'age': 37, 'city': '台北市'}

*如果將函式返回的資料直接用輸出
print(Ex_args_kwargs(1, 2, 3, name=”葉師傅”, age=37, city=”台北市”))
結果會是:
((1, 2, 3), {‘name’: ‘葉師傅’, ‘age’: 37, ‘city’: ‘台北市’})



6.參數位置示範

前面【1.說明】有提到參數位置很重要,複習一下:

一般位置參數、位置參數(*args)、一般關鍵字參數、關鍵字參數(**kwargs)

示範:

def Ex_func_order(pos1, pos2, *args, kw1=None, kw2=None, **kwargs):
    print("Positional arguments:", pos1, pos2)
    print("Additional positional arguments (args):", args)
    print("Keyword arguments:", kw1, kw2)
    print("Additional keyword arguments (kwargs):", kwargs)

    # 傳回結果
    return pos1, pos2, args, kw1, kw2, kwargs

# 調用函數並接收返回值
result = Ex_func_order(1, 2, 3, 4, 5, kw1="hello", kw2="world", extra_kw1="foo", extra_kw2="bar")

# 輸出返回值
print("Returned values:", result)


輸出結果:

Positional arguments: 1 2
Additional positional arguments (args): (3, 4, 5)
Keyword arguments: hello world
Additional keyword arguments (kwargs): {'extra_kw1': 'foo', 'extra_kw2': 'bar'}
Returned values: (1, 2, (3, 4, 5), 'hello', 'world', {'extra_kw1': 'foo', 'extra_kw2': 'bar'})




參考資料

[1] 【Python】*args**kwargs的用法【最全详解】

[2] Day19- 隨心所欲的自定義函數參數介紹

[3] ChatGPT

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *