python和c++不同,並沒有指標,因此python中的*號作用和c++中不同。網上對於這方面的教程寫的囉囉嗦嗦,一點不簡明扼要。看的讓人找不到重點。我這裡快速的講解一下。
輸出c當然是1×2=2。相信這並非是大家關心的重點。a=1
b=2c=a*b
這樣無需確保值與變數的個數相同。舉例來說:
a,b,*c=[1,2,3,4]
c前面的*號主要是為了收集引數。這樣輸出a,是1;輸出b,是2,輸出c,是[3,4]。注意這裡收集的是列表。
具體用途,是看用*號的場合是在函式定義時還是函式呼叫時。(這句話至關重要!)
3.1 如果在定義函式時,*代表收集引數,**代表收集關鍵字引數。
3.1.1定義函式時,乙個*的情況:
這時候如果以如下方式呼叫myprintdef myprint(*params):
print(params)
>>> myprint(1,2,3)
則會輸出:
(1,2,3)
因此作用是將呼叫時提供的所有值,放在乙個元組裡。
跟上面2裡的有所區別,2裡是收集列表中多餘的引數,而這裡是收集好引數,一起放進元組裡面。
這種情況下,在函式定義時的形參裡的*params後面,就最好不要再加入別的形參了,比如你定義成 def myprint(*params,x) ,呼叫的時候myprint(1,2,3),就會報錯。因為這樣python分不清哪個資料是給params的。如果你非要這麼定義也行,不過在呼叫的時候,必須顯示的指出哪個值是給x的。比如myprint(1,2,x=3),通過這種方式呼叫才不會出錯。
3.1.2 定義函式時,兩個**的情況:
對於之前引數是*params的情況,myprint並不能傳入關鍵字引數。啥意思呢,就是仍然採取這種方式定義時:
這樣是錯誤的:def myprint1(*params):
print(params)
>>> myprint1(x=1,y=2,z=3) #會報錯
因為*號並不會收集關鍵字引數。所以需要如下方式修改,採用兩個星號:
這樣呼叫myprint2就不會有問題:def myprint2(**params):
print(params)
>>> myprint2(x=1,y=2,z=3)
會輸出如下結果:
得到乙個字典。字典中元素的先後順序取決於你的環境。
3.2 如果在呼叫函式時,*和**都是分配引數用的
3.2.1 呼叫函式時,乙個*的情況:
例如,還是剛剛那個print函式
這下形參有兩個了,但是我能不能只傳入乙個形參?def myprint(x,y):
print(x)
print(y)
對,「呼叫函式時分配引數」跟「定義函式時收集引數」,反過來了!
假設你還有乙個元組:
params=(1,2)
可以通過如下方式呼叫myprint函式:
>>> myprint(*params)
就可以輸出:
3.2.2 呼叫函式時,兩個**的情況:1
2
和上面3.1.2很像,是分配字典的。
這回params是乙個字典了:
params=
可以通過如下方式呼叫myprint函式:
>>> myprint(**params)
就可以輸出:
3.3 如果在定義和呼叫函式時,都使用*號呢?1
2
這樣將值傳遞元組或字典,沒有實際意義,不發揮收集引數或者分配引數的意義,不如不用。
例項:
資料庫查詢過濾字段:
session.query(myclass).filter_by(id="111", info="test")
如果想把字段以引數傳遞進來
web_dict=
session.query(myclass).filter_by(**web_dict)
這樣就可以了
python中 單星號( )與雙星號( )的使用
原帖位址見 python 12 星號變數的特殊用法 在python中,星號除了用於乘法數值運算和冪運算外,還有一種特殊的用法 在變數前新增單個星號或兩個星號 實現多引數的傳入或變數的拆解,本文將詳細介紹 星號引數 的用法。最初,星號變數是用在函式的引數傳遞上的,在下面的例項中,單個星號代表這個位置接...
python 中帶星號和雙星好的引數
當要使函式接收元組或字典形式的引數的時候,有一種特殊的方法,它分別使用 和 字首。這種方法在函式需要獲取可變數量的引數的時候特別有用。def powersum power,args return the sum of each argument raised to specified power.t...
Python中星號 的用法
1 表示乘號 2 表示倍數,例如 def t msg,time 1 print msg time t hi 3 列印結果 列印3次 hi hi hi3 單個 星號 1 如 parameter是用來接受任意多個引數並將其放在乙個元組中。def demo p print p demo 1,2,3 1,2...