[Python3]星號*的打開方式

python中,* 號除了用來作數量乘法,還有其餘的用處。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

比較使用和不使用*號後產生的結果就能夠發現,單*號將可迭代對象進行了拆分,按單個元素方式依次將數據傳進方法。
配合其餘方法使用能夠優雅的完成矩陣的行轉列操做。git

雙**號的使用,是將變量對象拆分紅鍵值對的形式,因此只有dict類型可使用。
注意上面的func3,他須要三個形參,可是咱們只傳入**dict_obj, 就完成了功能。github

可迭代對象有: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進行使用。code

具體實驗代碼能夠經過Github得到。orm

相關文章
相關標籤/搜索