一、概述
1、前文已經提過位置參數、默認參數,這兩種是最常用的參數。
2、動態參數即不限定參數個數,以一種動態的方式接受傳參的個數。
3、python的動態參數有兩種,分別是 ‘ *args ’ 和 ‘ **kwargs ’ 。他們區別在於是一個星號還是兩個星號,而不是 args 和kwargs ,實際上定義成 ‘ *cat ’ 和 ‘ **dog’ 也是可以的,只是按照約定俗稱的寫法,通常寫成 ‘ *args ’ 和 ‘ **kwargs ’。
4、注意:動態參數必須放在所有位置參數和默認參數后面!
二、一個星號
1、一個星號的動態參數表示接收任意個參數,調用時會將實際參數打包成一個元組傳入。如果參數是個列表,則會將整個列表當成一個參數傳入。
如圖所示,動態參數傳入的4,5,6會被打包成一個元組傳入到函數內部。
2、如果當傳入的動態參數是一個列表,則會將整個列表當成一個參數傳入。
如圖,傳入的[4,5,6]被當成元組的中的一個元素傳入了。如果想把列表也當成當個元素逐個傳入呢?可以使用*傳參!如下圖所示。
在傳參是添加一個*,就可將列表中的元素逐個傳入。實際上所有序列類型的元素都可以是用這種方式傳遞,比如字符串、元組、字典等。
3、一個星號的特殊情況!
當一個星號的動態參數位於n個默認參數后面時,python會自動將一個星號的動態參數的前n個賦值為默認參數。
如圖所示,默認將動態參數的4,5賦值給了c、d,這是python內部的傳參規則。
三、兩個星號
1、兩個星號的動態參數,會將傳入的參數打包成字典傳給函數。
2、而如果當傳入的動態參數是一個字典時,程序會報錯。為了解決這個問題,可以使用兩個*將字典值逐個傳入。
3、兩個星號的動態參數必須置於一個星號動態參數的后面!
四、萬能參數 & 關鍵字參數
1、一個星號的動態參數 + 兩個星號的動態參數 = 萬能參數!
2、萬能參數可能不受參數的個數限制,在靈活的同時也帶了一些麻煩。
例如,我們在招聘的時候要求必須傳入‘age’這個參數,就可以使用關鍵字參數進行限定。關鍵字參數使用 * 進行區別,即 * 號后面的內容都是關鍵字參數。
注意 :關鍵參數在調用時必須船用參數名稱。
3、對於動態參數里面的關鍵參數,不需要加 * ,直接在動態參數后面限定即可。
注意:關鍵參數必須要傳,但是可以穿空缺值。下面這種方式可以。
但下面這種方式就會報錯。