過量的參數
在運行時知道一個函數有什么參數,通常是不可能的。另一個情況是一個函數能操作很多對象。更有甚者,調用自身的函數變成一種api提供給可用的應用。
對于這些情況,python提供了兩種特別的方法來定義函數的參數,允許函數接受過量的參數,不用顯式聲明參數。這些“額外”的參數下一步再解釋。
注意args和kwargs只是python的約定。任何函數參數,你可以自己喜歡的方式命名,但是最好和python標準的慣用法一致,以便你的代碼,其他的程序員也能輕松讀懂。
位置參數
在參數名之前使用一個星號,就是讓函數接受任意多的位置參數。
>>>defmultiply(*args):
...total=1
...forarginargs:
...total*=arg
...returntotal
...
>>>multiply(2,3)
6
>>>multiply(2,3,4,5,6)
720
python把參數收集到一個元組中,作為變量args。顯式聲明的參數之外如果沒有位置參數,這個參數就作為一個空元組。
關鍵字參數
python在參數名之前使用2個星號來支持任意多的關鍵字參數。
>>>defaccept(**kwargs):
...forkeyword,valueinkwargs.items():
...print"%s=>%r"%(keyword,value)
...
>>>accept(foo='bar',spam='eggs')
foo=>'bar'
spam=>'eggs'
注意:kwargs是一個正常的python字典類型,包含參數名和值。如果沒有更多的關鍵字參數,kwargs就是一個空字典。
混合參數類型
任意的位置參數和關鍵字參數可以和其他標準的參數聲明一起使用?;旌鲜褂脮r要加些小心,因為python中他們的次序是重要的。參數歸為4類,不是所有的類別都需要。他們必須按下面的次序定義,不用的可以跳過。
1)必須的參數
2)可選的參數
3)過量的位置參數
4)過量的關鍵字參數
defcomplex_function(a,b=None,*c,**d):
這個次序是必須的,因為*args和**kwargs只接受那些沒有放進來的其他任何參數。沒有這個次序,當你調用一個帶有位置參數的函數,python就不知道哪個值是已聲明參數想要的,也不知道哪個被作為過量參數對待。
也要注意的是,當函數能接受許多必須的參數和可選的參數,那它只要定義一個過量的參數類型即可。
傳遞參數集合
除了函數能接受任意參數集合,python代碼也可以調用帶有任意多數量的函數,像前面說過的用星號。這種方式傳遞的參數由python擴展成為參數列表。以便被調用的函數
不需要為了這樣調用而去使用過量參數。python中任何可調用的,都能用這種技法來調用。并且用相同的次序規則和標準參數一起使用。
>>>defadd(a,b,c):
...returna+b+c
...
>>>add(1,2,3)
6
>>>add(a=4,b=5,c=6)
15
>>>args=(2,3)
>>>add(1,*args)
6
>>>kwargs={'b':8,'c':9}
>>>add(a=7,**kwargs)
24
>>>add(a=7,*args)
Traceback(mostrecentcalllast):
File"",line1,in
TypeError:add()gotmultiplevaluesforkeywordargument'a'
>>>add(1,2,a=7)
Traceback(mostrecentcalllast):
File"",line1,in
TypeError:add()gotmultiplevaluesforkeywordargument'a'
注意這個例子的最后幾行,特別留意當傳遞一個元組作為過量的位置參數時,是否要顯式的傳遞關鍵字參數。因為python使用次序規則來擴展過量的參數,那位置參數要放在前面。這個例子中,最后兩個調用是相同的,python不能決定那個值是給a的。
以上內容為大家介紹了Python參數知識,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.dietsnews.net/