python與c++不同,並沒有指針
a=1
b=2
c=a*b
輸出c當然是1×2=2。相信這並非是大家關心的重點。
這樣無需確保值與變量的個數相同。舉例來說:
a,b,c=[1,2,3,4]
c前面的號主要是為了收集參數。這樣輸出a,是1;輸出b,是2,輸出c,是[3,4]。注意這裡收集的是列表。
具體用途,是看用*號的場合是在函數定義時還是函數調用時。(這句話至關重要!)
這時候如果以如下方式調用myprint
因此作用是將調用時提供的所有值,放在一個元組裡。
跟上面2裡的有所區別,2裡是收集列表中多余的參數,而這裡是收集好參數,一起放進元組裡面。
這種情況下,在函數定義時的形參裡的*params後面,就最好不要再加入別的形參了,比如你定義成 def myprint(*params,x) ,調用的時候myprint(1,2,3),就會報錯。因為這樣python分不清哪個數據是給params的。如果你非要這麼定義也行,不過在調用的時候,必須顯示的指出哪個值是給x的。比如myprint(1,2,x=3),通過這種方式調用才不會出錯。
對於之前參數是*params的情況,myprint並不能傳入關鍵字參數。啥意思呢,就是仍然采取這種方式定義時:
這樣是錯誤的:
因為*號並不會收集關鍵字參數。所以需要如下方式修改,采用兩個星號:
這樣調用myprint2就不會有問題:
得到一個字典。字典中元素的先後順序取決於你的環境。
例如,還是剛剛那個print函數
這下形參有兩個了,但是我能不能只傳入一個形參?
對,“調用函數時分配參數”跟“定義函數時收集參數”,反過來了!
假設你還有一個元組:
params=(1,2)
可以通過如下方式調用myprint函數:
myprint(*params)
就可以輸出:
和上面3.1.2很像,是分配字典的。
這回params是一個字典了:
params={‘x’:1,‘y’:2}
可以通過如下方式調用myprint函數:
myprint(**params)
就可以輸出: