引數、解包與變數
一、python引數變數
python命令列執行程式命令如下:
python test.py arg1 arg2 arg3
Python 中可以使用sys的sys.argv來獲取命令列引數:
- sys.argv 是命令列引數列表。
- len(sys.argv) 是命令列引數個數。
注:sys.argv[0] 表示指令碼名。
如下圖所示:
二、pytho表示式解包
解包在英文裡叫做 Unpacking,就是將容器(容器內元素可變)裡面的元素逐個取出來放在其它地方,好比你去菜市場買了一袋蘋果回來分別發給家裡的每個成員,這個過程就是解包。Python 中的解包是自動完成的。
如上面的argv引數變數,我們通過argv獲取到命令列的所有引數(包括指令碼名),它是一個引數列表,然後我們可以把獲取到的引數列表傳遞給其他變數,如下圖
其中scriptname,firstParam,secondParam=argv 就是在解包
任何可迭代物件都支援解包,除了上面的列表,可迭代物件包括元組、字典、集合、字串、生成器等實現了__next__方法的一切物件
-
元祖解包
-
字串解包
-
字典解包
注意:字典解包後,只會把字典的 key 取出來,value 則丟掉了
如果要把key和value都獲取到可以如下:
包括常見的多變數賦值其實也是一個自動解包的過程,等號右邊其實是一個元組物件(3, 4)
有時候我們給變數賦值時程式碼不小心多了一個逗號,,就變成了元組物件
如果在解包過程中,遇到左邊變數個數小於右邊可迭代物件中元素的個數時該怎麼辦? 好比你們家有3口人,你卻買了4個蘋果,怎麼分配呢?
Python2 中,如果等號左邊變數的個數不等於右邊可迭代物件中元素的個數,是不允許解包的。但Python3 中可以進行解包,怎麼做呢?
就是在某個變數面前加一個星號,而且這個星號可以放在任意變數上,每個變數都分配一個元素後,剩下的元素都分配給這個帶星號的變數就是,如下圖
三、pytho函式呼叫解包
函式呼叫時,有時你可能會用到兩個符號:星號*和 雙星號**。
如下圖所示定義了有a,b,c三個引數的函式,然後我們呼叫的時候就必須向裡面傳入三個引數
呼叫時除了直接傳入三個引數外,我們也可以傳入一個包含有3個元素的可迭代物件,使用星號*解包一個可迭代物件作為函式的引數,如下圖所示
另外對於字典物件,可以使用兩個星號,它會自動解包成關鍵字引數 key=value 的格式並傳遞給函式:如下圖
func(**{"a":1,"b":2,"c":3})會自動解包成func(a=1,b=2,c=3)的形式進行引數傳遞
所以此時要注意:關鍵字a,b,c,也就是字典的key一定要與func這個函式中定義的引數一致,如果不一樣,就會出現錯誤
總結:
- 自動解包支援一切可迭代物件
- python3中,支援更高階的解包操作,用星號操作使得等號左邊的變數個數可以少於右邊迭代物件中元素的個數。
- 函式呼叫時,可以用 * 或者**解包可迭代物件,作為引數傳遞,一個星號可作用於所有的可迭代物件作為位置引數傳遞給函式,兩個星號只能作用於字典物件,作為關鍵字引數傳遞給函式