[Python3]星號*的打開方式
python中,* 號除了用來做數量乘法,還有其他的用處。
結論
- 概括的來說,就是對修飾的變數進行拆分, 對修飾的形式參數進行參數聚集。
- 單*號,將被修飾的變數按元素方式拆分, 對修飾的形式參數進行參數聚集。
- 雙**號,將被修飾的變數按鍵值對進行拆分, 對修飾的形式參數進行參數聚集。
修飾實例變數時
- 作用: 講被修飾的實例變數或者可迭代對象進行拆分
def func3(a, b, c):
print("param a is {}, param b is {}, param c is {}".format(a, b, c))
if __name__ == '__main__':
arr1 = [1, 2, 3]
print(arr1, sep='\t') # [1, 2, 3]\t 正常輸出
print(*arr1, sep='\t') # 1\t2\t3 每個數字中間以\t分割
arr2 = [[1, 2, 3], [3, 4, 5], [5, 6, 7]]
print(list(zip(*arr2))) # [(1, 3, 5), (2, 4, 6), (3, 5, 7)] 二維數組的行轉列
dictionary = {'a': 1, 'b': 2, 'c': 3}
print(dictionary, sep='\t') # {'a': 1, 'b': 2, 'c': 3}\t 正常輸出
print(*dictionary, sep='\t') # a\tb\tc\t 每個字母中間以\t分割
print(func3(**dictionary)) # param a is 1, param b is 2, param c is 3
比較使用和不使用*號後產生的結果就可以發現,單*號將可迭代對象進行了拆分,按單個元素方式依次將數據傳進方法。
配合其他方法使用可以優雅的完成矩陣的行轉列操作。
雙**號的使用,是將變數對象拆分成鍵值對的形式,所以只有dict類型可以使用。
注意上面的func3,他需要三個形參,但是我們只傳入**dict_obj, 就完成了功能。
可迭代對象有:list, dict, tuple, generator, iterator
出現在方法的形式參數位置
- 作用: 放在參數列表的末尾, 作為不定長的參數列表的形參接受對象。 (可以類比Java的可變參數列表)
def func1(*args):
print("type", type(args)) # type <class 'tuple'>
print("all arguments: ", args) # all arguments: (1, 2, 3)
print("second argument: ", args[1]) # second argument: 2
def func2(**kw):
print("type", type(kw)) # type <class 'dict'>
print("all arguments: ", kw) # all arguments: {'a': 1, 'b': 2, 'c': 3}
print("second argument: ", kw['a']) # second argument: 1
if __name__ == '__main__':
a, b, c = 1, 2, 3
func1(a, b, c)
func2(a=a, b=b, c=c)
儘管函數func1的形參只有一個,但被傳遞三個參數,程式還是可以正常運行。
因為*args將三個參數以tuple形式存儲,作為一個整體傳遞給方法func1。
同理,func2的**kw形參將傳入的三個參數壓成一個dict進行使用。
具體實驗程式碼可以通過Github獲得。