如果用過(guò)C語(yǔ)言中的printf(),那么就會(huì)對(duì)參數(shù)個(gè)數(shù)可變的意義比較了解. 盡管可選參數(shù)的機(jī)制令函數(shù)的參數(shù)個(gè)數(shù)是可變的,但是還是有限制的,參數(shù)個(gè)數(shù)有最大限制,而且還要指明哪些是可選參數(shù),而下面這個(gè)機(jī)制,可以接受任意多個(gè)參數(shù).
>>> def printf(format,*arg):
... print format%arg
...
>>> printf ("%d is greater than %d",1,2)
1 is greater than 2
其中*arg必須是最后一個(gè)參數(shù), *表示接受任意多個(gè)參數(shù),除了前面的參數(shù)后,多余的參數(shù)都作為一個(gè)tuple傳遞給函數(shù)printf,可以通過(guò)arg來(lái)訪問(wèn).
還有一種方式來(lái)實(shí)現(xiàn)任意個(gè)數(shù)參數(shù), 就是參數(shù)按照dictionary的方式傳遞給函數(shù), 函數(shù)同樣可以接受任意多個(gè)參數(shù).
>>> def printf(format,**keyword):
... for k in keyword.keys():
... print "keyword[%s] is %s"%(k,keyword[k])
...
>>> printf("ok",One=1,Two=2,Three=3)
keyword[Three] is 3
keyword[Two] is 2
keyword[One] is 1
同上一種機(jī)制類(lèi)似, 只不過(guò)**keyword是用**表示接受任意個(gè)數(shù)的有名字的參數(shù)傳遞,但是調(diào)用函數(shù)時(shí),要指明參數(shù)的名字,one=1,two=2... 在函數(shù)中, 可以用dictionary的方式來(lái)操作keyword,其中keys是['one','two','three'],values是[1,2,3]. 還可以將兩種機(jī)制和在一起, 這時(shí), *arg,要放在**keyword前面.
>>> printf("%d is greater than %d",2,1,Apple="red",One="1")
2 is greater than 1
keyword[Apple]=red
keyword[One]=1
>>> def testfun(fixed,optional=1,*arg,**keywords):
... print "fixed parameters is ",fixed
... print "optional parameter is ",optional
... print "Arbitrary parameter is ", arg
... print "keywords parameter is ",keywords
...
>>> testfun(1,2,"a","b","c",one=1,two=2,three=3)
fixed parameters is 1
optional parameter is 2
Arbitrary parameter is (’a’, ’b’, ’c’)
keywords parameter is {’three’: 3, ’two’: 2, ’one’: 1}
函數(shù)接受參數(shù)的順序, 先接受固定參數(shù),然后是可選參數(shù),然后接受任意參數(shù),最后是帶名字的任意參數(shù).