
常見的函式的輸入參數數量是固定的,例如下面的代碼範例有個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) |
*學過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的用法【最全详解】
[3] ChatGPT
