收集引數(不定參)的逆過程
不定參—可接受數量不固定的引數,擁有擴充套件的能力。對於那些傳入引數的數量不確定的程式有很重要的作用,但同時由於不定參可同時接受很多引數,這也帶來了隱患—引數不合法。要解決這個問題就需要使用斷言(assert)或者(try except)來增加對引數合法性的檢驗及引數不合法時的容錯。
不定參有兩種形式 * params和 * * params
1、* params 以位置引數的形式接受傳入的引數,所有的引數存放在乙個元組當中,傳入引數的順序即為元組中元素的順序。不接受關鍵字傳參的形式!
2、* * params以關鍵字引數的形式接受傳入的引數,並將關鍵字引數以kv對的形式儲存在乙個字典中。不接受位置引數,僅接受關鍵字引數!
若不定參位於位置引數之後則傳入的引數會按順序先傳入位置引數再將剩下的所有傳入不定參,不會丟擲僅接受關鍵字引數的異常。
def
test
( a ,
*params_a)
:print
(a)print
(*params_a)
print
(params_a)
for each in params_a:
print
(each)
return params_a
a = test(1,
2,3,
4,5,
6)print
(type
(a))
若使用的不定參為* * params的形式則僅接受關鍵字傳參,以位置引數的形式傳入則會丟擲異常(畢竟收集到的引數是存放在字典中,一定要有k才能有v),且傳入的關鍵字引數不可重複(即不可自身重複,也不可與已有的形參名重複) 重複則丟擲異常。
def
test
( a ,
**params_a)
:print
(a)print
(*params_a)
print
(params_a)
for each in params_a:
print
(each)
return params_a
a = test(
1, aa=
2, b=
3, c=
4, d=
5, e=6)
print
(type
(a))
若不定參位於非不定參的前面,則後面的引數一定要使用關鍵字引數才可正常呼叫,否則將丟擲卻是僅關鍵字引數的異常。
def
test
(*params_a,a )
:print
(a)print
(*params_a)
print
(params_a)
for each in params_a:
print
(each)
return params_a
a = test(1,
2,3,
4,5,
6,a =9)
print
(type
(a))
僅有* params的形式才可以將形參放置到不定參後面,* * params後若有形參則無法通過語法檢測。
上面討論的收集引數是在形參中加入* 和 * *來達到收集引數的目的。那如果將 *用在實參中會怎麼樣呢?
如果有如下函式,求取4個值的和,那就需要對4個值分別傳入。如下以元組的方式傳入會丟擲異常,提示缺少3個引數(此處將元組當作第乙個引數了)
def
ad(a, b, c,d )
:return a+ b+c+d
a =(1,
2,3,
4)res = ad(a)
print
(res)
但是若以如下的方式傳入則可正常執行。即在實參中以*引數的形式傳入會將傳入的序列(元組、列表、集合、字串)拆分為單個的引數傳入。引數的數量要對應,過多的引數和過少的引數都會丟擲異常。
def
ad(a, b, c,d )
:return a+ b+c+d
a =(1,
2,3,
4)res = ad(
*a)print
(res)
當函式的形參以**para的形式收集關鍵字引數時,需要給以關鍵字引數的形式傳入實參。 此時若有乙個字典,又不想對其解析之後再傳入即可 使用 * *字典的形式,python直譯器會自動將此字典拆分為多個kv對傳入。 python3 函式 不定長引數 不定參
第一種不定長引數 args args 稱為不定長引數,只能放在形參的最後位置,返回的是乙個元組 def num a,b,args print a print b print args num 11,22 返回結果 1122 33,55會放在元組args中 num 11,22,33,55 返回結果 1...
python函式不定參
寫函式時,預先可能不確定會傳入多少個引數,以及傳入的方式,這時候可以通過不定參的形式傳遞 def test args,kwargs print args args print kwargs kwargs if name main test 1,2,3,4,a 5,b 6,c 7 args 1,2,3...
Python 不定引數
不定引數的引入可以提高程式的靈活性 def test a,b,c print c 此時c便成為了不定引數 test 11,22,33,44,55 test 11 錯誤,形參至少需要兩個實參 33 44,55 def test a,b,c,d print a print b print c print...