python允許在形參前面添加一個(gè)星號(hào)(*),這樣就意味著該參數(shù)可接收多個(gè)參數(shù)值,多個(gè)參數(shù)值被當(dāng)成元組傳入。
下面程序定義了一個(gè)形參個(gè)數(shù)可變的函數(shù):
#定義了支持參數(shù)收集的函數(shù)
deftest(a,*books):
print(books)
#books被當(dāng)成元組處理
forbinbooks:
print(b)
#輸出整數(shù)變量a的值
print(a)
#調(diào)用test()函數(shù)
test(5,"千鋒","Python教程")
運(yùn)行上面程序,將看到如下運(yùn)行結(jié)果:
('千鋒','Python教程')
千鋒
Python教程
5
從上面的運(yùn)行結(jié)果可以看出,當(dāng)調(diào)用test()函數(shù)時(shí),books參數(shù)可以傳入多個(gè)字符串作為參數(shù)值。從test()的函數(shù)體代碼來(lái)看,參數(shù)收集的本質(zhì)就是一個(gè)元組:Python會(huì)將傳給books參數(shù)的多個(gè)值收集成一個(gè)元組。
Python允許個(gè)數(shù)可變的形參可以處于形參列表的任意位置(不要求是形參列表的最后一個(gè)參數(shù)),但Python要求一個(gè)函數(shù)最多只能帶一個(gè)支持“普通”參數(shù)收集的形參。例如如下程序:
#定義了支持參數(shù)收集的函數(shù)
deftest(*books,num):
print(books)
#books被當(dāng)成元組處理
forbinbooks:
print(b)
print(num)
#調(diào)用test()函數(shù)
test("千鋒","Python教程",num=20)
正如從上面程序中所看到的,test()函數(shù)的第一個(gè)參數(shù)就是個(gè)數(shù)可變的形參,由于該參數(shù)可接收個(gè)數(shù)不等的參數(shù)值,因此如果需要給后面的參數(shù)傳入?yún)?shù)值,則必須使用關(guān)鍵字參數(shù),否則程序會(huì)把所傳入的多個(gè)值都當(dāng)成是傳給books參數(shù)的。
Python還可以收集關(guān)鍵字參數(shù),此時(shí)Python會(huì)將這種關(guān)鍵字參數(shù)收集成字典。為了讓Python能收集關(guān)鍵字參數(shù),需要在參數(shù)前面添加兩個(gè)星號(hào)。在這種情況下,一個(gè)函數(shù)可同時(shí)包含一個(gè)支持“普通”參數(shù)收集的參數(shù)和一個(gè)支持關(guān)鍵字參數(shù)收集的參數(shù)。例如如下代碼:
#定義了支持參數(shù)收集的函數(shù)
deftest(x,y,z=3,*books,**scores):
print(x,y,z)
print(books)
print(scores)
test(1,2,3,"千鋒","Python教程",語(yǔ)文=89,數(shù)學(xué)=94)
上面程序在調(diào)用test()函數(shù)時(shí),前面的1、2、3將會(huì)傳給普通參數(shù)x、y、z;接下來(lái)的兩個(gè)字符串將會(huì)由books參數(shù)收集成元組;最后的兩個(gè)關(guān)鍵字參數(shù)將會(huì)被收集成字典。運(yùn)行上面代碼,會(huì)看到如下輸出結(jié)果:
123
('千鋒','Python教程')
{'語(yǔ)文':89,'數(shù)學(xué)':94}
對(duì)于以上面方式定義的test()函數(shù),參數(shù)z的默認(rèn)值幾乎不能發(fā)揮作用。比如按如下方式調(diào)用test()函數(shù):
test(1,2,"千鋒","Python教程",語(yǔ)文=89,數(shù)學(xué)=94)
如果希望讓z參數(shù)的默認(rèn)值發(fā)揮作用,則需要只傳入兩個(gè)位置參數(shù)。例如如下調(diào)用代碼:
test(1,2,語(yǔ)文=89,數(shù)學(xué)=94)
以上內(nèi)容為大家介紹了python培訓(xùn)之可變參數(shù)怎么傳值,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。