0%

透過*和**來對群集資料Unpacking

在處理python的序列資料(tuple, list)或是映射資料(dict),並要把資料傳入function時,可使用*和**運算符來分別對兩種資料作unpacking並傳入函式

針對序列(tuple, list)可以使用拆開序列運算符(sequence unpacking operator),在變數前加上*前綴來達成

1
2
3
4
5
6
7
8
9
10
11
12
def product(a, b, c):
return a * b * c

T = (2, 5, 10)
product(T[0], T[1], T[2]) # 用切片讀出tuple資料傳入函式
product(*T) # 直接將tuple unpacking成3個資料項傳入函式
product(T[0], *T[1:]) # 先切出1個資料項,再拆開2個資料項

L = [2, 5, 10]
product(L[0], L[1], L[2]) # 用切片讀出list資料傳入函式
product(*L) # 直接將list unpacking成3個資料項傳入函式
product(L[0], *L[1:]) # 先切出1個資料項,再拆開2個資料項

上面的範列product函式會接受3個引數,透過*來直接對序列作unpacking,就能將序列內的資料項直接傳入函式,而不用先讀出來或是對序列作切片(slice)

針對映射資料(dict)則是使用拆開映射運算符(mapping unpacking operator),在變數前加上**前綴

1
2
D = {'a': 2, 'b': 5, 'c': 10}
product(**D)

上面範例會將dic以key-value拆開,在傳入函式後會將每個key的value分配給與key相同名稱的參數(parameter)。要注意的是,如果字典裡面的key和函式參數對應不起來,則會引發TypeError。

除非函式的參數有設定預設值(Default),例如以下範例函式參數d有預計值20,若字典沒有d,d在函式中就會帶入預設值而不會引發TypeError

1
2
3
4
5
def product(a, b, c, d=20):
return a * b * c * d

D = {'a': 2, 'b': 5, 'c': 10}
product(**D)

參考資料:
函式參數預設值請參考: 位置引數(Positional Argument)與關鍵字引數(Keyword Argument)
Python docs - unpacking argument lists