函數參數
首先,我們必須明確的是參數調用時傳入的參數要和定義的個數相等!
位置參數
例如:定義一個函數 def fun(x,y,z) 調用時 fun(1,2,3)此時是按照參數定義的順序傳入實參。關鍵字參數
例如:定義一個函數 def fun(x,y,z),調用時fun(x=1,y=2,z=3)此時使用形參的名字來傳入實參,傳參的順序就可以不同了。
函數參數默認值
定義函數時,在形參後面加上一個值:
def add(x=4,y=5)
return x+y
print(add()) //9
print(add(6)) //11 默認6是X的值,y仍然是5
print(add(6,y=7))//13
print(add(6,x=5)) //TypeError(發生錯誤)傳參按位置進行,6已經是X的值了,再傳入一個X發生錯誤
print(add(x=6,7)) //TypeError(發生錯誤)位置參數必須在關鍵字前面
print(add(7,x=6)) //13
在參數非常多的時候可以傳入必須參數,可以避免繁瑣!
可變參數
- 位置參數的可變參數
def add(num):
sun = 0
for i in num:
sun += i
print(sum)
add(1)
add([1,3,2])
add((2,4,3))
傳入單個對象或者可迭代的對象!
def add(*num):
sun = 0
for i in num:
sun += i
print(sum)
add([1,3,2])
在形參前使用 * 表示該形參是可變參數,可以接收多個參數,組成一個元組。
- 關鍵字參數的可變參數
def show(**kwargs):
for k,v in kwargs.items():
print('{} = {}'.format(k,v))
show(host='127.0.0.1',port='8080',username='xmc')
形參前使用 ** 符號,表示可以接收多個關鍵字參數,組成一個字典!
總結上面的內容舉個實例代碼解析一下:
def fun(x,y,*args,**kwargs): #這裏麪包含着位置參數、關鍵字參數,位置參數的可變參數,關鍵字參數的可變參數
fun(1,2) #1給x,2給y,這容易理解
fun(1,2,3) #1給x,2給y,3給 *args
fun(1,2,3,4,5) #1給x,2給y,之後的3,4,5就是一個元組,統一賦值給了 *args,大家理解一下,就是一個迭代的對象
fun(1,2,3,4,5,m=6,n=7,p='xmc') #這就是四種參數都有了,1給x,2給y,3,4,5都給了 *args,之後的m,n,p就是一個字典,一組鍵值對!
- Keyword-only參數
如果在一個 位置可變參數之後出現了普通的參數,此時這個普通參數已經不再普通,稱爲keyword-only參數。
def fun(*args,x): #定義函數
fun(1,2) #1,2作爲一個元組賦給*args
fun(1,2,x = 3) #此時1,2作爲一個元組賦給*args,3賦給x
可見,在這種情況下,x必須使用關鍵字參數才能得到實參!
如果在一個關鍵字參數的可變參數之後出現了普通參數就沒有意義了,如下代碼!
def fun(**kwargs,x) //在調用函數時,不管傳入的實參是什麼,他都會默認爲是賦給**kwargs的值,即使你傳參是 x=1也是這樣,默認爲字典!
- 參數解構
在給函數提供參數時,一旦實參是集合類型的,我們需要對實參進行解構,提取元素!
def add(x,y):
return x+y
add(1,2) #3
add((4,5)) #error 此時傳入的是一個元組,不是單個元素
add(*(4,5)) #9
add(*[1,2]) #3
add({'x':1,'y':2}) #error 此時傳入的是一個字典,錯誤
add(*{'x':1,'y':2}) #error
add(**{'x':1,'y':2}) #3 此時字典內的key值必須和函數的形參相對應!
非字典類型使用 * 來解構成位置參數,字典類型使用 ** 來解構成關鍵字參數!