0%

使用*args和**kwargs來拆開函式參數

我們可以透過拆開運算符,來達到建立具有接收不固定位置引數和不估定關鍵字引數的函式。假設我們今天要建立一個,可以讀取不固定引數數量的函式,就會很有用。

舉例來說,當我們要建立一個能將所有引數平方相加函式,可以使用下列寫法:

1
2
3
4
5
6
7
8
9
10
11
12
def sum_of_power(args):
result = 0
for arg in args:
result += arg ** 2
return result

>>> sum_of_power(1, 2, 3, 4)
30
>>> sum_of_power([2, 2, 2])
12
>>> sum_of_power(*[3, 4, 5, 6][2:]))
61

有*前綴的argv表示函式接收的引數是一個元組(type(args)會得到<class ‘tuple’=””>),像是把傳入的多個引數packing成一個元組,再透過拆開運算符來將元組拆開成多個位置引數作處理。而關鍵字引數也可以應用在位置引數之後,假如我們要讓相加的引數改成可指定的次方向,可在函式加上關鍵字引數:

1
2
3
4
5
6
7
8
9
10
def sum_of_power(args power=2):
result = 0
for arg inargs:
result += arg * power
return result

>>> sum_of_power(1, 2, 3, 4) # 僅指定位置引數
30
>>> sum_of_power(1, 2, 3, 4, power=1) # 同時指定位置引數和關鍵字引數
10

有兩個*前綴的kwargv表示接收的引數是一個字典(type(kwargs)會得到<class ‘dict’=””>),像是把傳入的多個關鍵字引數packing成一個字典,再透過拆開運算符來將字典拆開成多個關鍵字引數作處理。假設今天要針對不同會員設定多個會員詳細資料,可以用下列寫法:

1
2
3
4
5
6
7
8
9
def personal_detail(account, **kwargs):    
print('Account detail: ' + account)
for key in kwargs.keys():
print(key + ': ' + kwargs[key])

>>> personal_detail('a1234@gmail.com', first_name='Tom', last_name='Lin')
Account detail: a1234@gmail.com
first_name: Tom
last_name: Lin

呼叫此函式時,只允許傳入一個位置引數,或是可以用關鍵字引數方式,來額外提供多個資訊。

參考資料:
位置引數(Positional Argument)與關鍵字引數(Keyword Argument)
透過*和**來對群集資料Unpacking
Python docs - Arbitrary Argument Lists