1.包裹傳參
首先思考一個問題:為什么要有包裹傳參?原因包括但不僅限於以下兩點:①不確定參數的個數。②希望函數定義的更加松散靈活
包裹傳參分兩種:包裹位置傳參和包裹關鍵字傳參。先看包裹位置傳參:
在這里,如果先說定義肯定有些晦澀難懂,我們直接看下面這個例子吧!
1 def package_position(*all_arguments): 2 print(type(all_arguments)) 3 print(all_arguments)
這里定義了一個函數package_position(),其傳入參數與一般的參數不一樣,前面有一個*號,表明這是一個包裹,接下來調用的時候如下:
1 package_position(1, 4, 6) 2 package_position(5, 6, 7, 1, 2, 3)
那么打印的結果呢,是這樣的:
根據函數的定義,我們知道,打印的第一行是傳入的參數的類型(即type),根據打印結果,我們知道這是一個tuple,即元祖類型。也就是說,當我們在調用這個方法的時候,傳入的參數1,4,6,最后全部包在一起,封裝成一個tuple,傳遞給函數內部。打印的第二行,就是該元祖的內容。然后,根據打印結果的第二行,我們可以知道,這就是我們在調用時傳入的1,4,6。
總結一下:在調用package_position()時,所有的數據都根據先后順序,收集到一個元祖,在函數內部,我們可以通過元祖來讀取傳入的數據,這就是包裹位置傳參。
再來看看什么時包裹關鍵字傳參:
有了以上包裹位置傳參,那么包裹關鍵字傳參就不多說了,還是直接看例子:
1 def package_keyword(**all_arguments): 2 print(type(all_arguments)) 3 print(all_arguments) 4 5 package_keyword(a = 1, b = 9) 6 package_keyword(m = 2, n = 1, c = 11)
與上面一個例子類似,當函數調用時,所有參數會收集到一個數據容器里。只不過,在包裹關鍵字傳遞的時候,,數據容器不再是一個元祖,而時一個字典。每個關鍵字形式的參數調用,都會成為字典的一個元素。參數名為元素的鍵,而數據成為元素的值。字典all_arguments收集了所有的參數,把數據傳遞給函數使用。為了提醒,參數all_arguments是包裹關鍵字傳遞所有的字典,因此在all_arguments前加**。打印結果如下:
2.解包裹
1 def unpackage(a, b, c): 2 print(a, b, c) 3 4 args = (1, 3, 4) 5 unpackage(*args) 6 7 args = {"a":1, "b":2, "c":3} 8 unpackage(**args)
根據上面的代碼,估計讀者也大概知道了關於解包裹的概念。我們調用函數時傳遞的是一個元祖,按照基本傳參的方式,一個元祖是無法和三個參數對應上的。但我們通過在args前加上*符號,來提醒Python,我想把元祖拆成三個元素,每一個元素對應函數的一個位置參數。於是,元祖的三個元素分別賦予了三個參數。
相應的,詞典也可用於解包裹(上述代碼第7,8行)。在傳遞詞典args時,讓詞典的每個鍵值對作為一個關鍵字傳遞給函數。