python的參數分類
python參數可以分為兩類:1.定義時的參數——形參(形式參數)、2.調用時的參數——實參(實際參數,傳參)
實參的規則
實參就是在函數調用的時候,通過函數后面的括號傳遞給函數,讓函數處理的值,如下:
def factorial(x, y): # 定義一個factorial函數,設置兩個形參
""" This is a function that can calculate the product of the two parameter that you send. """ # 這稱為函數的文檔,對函數作說明的,可寫可不寫,可參考本人博客
return x * y
factorial(3, 5) # 調用傳參,正確
factorial(2, y=5) # 調用傳參,正確
factorial(x=7, y=5) # 調用傳參,正確
factorial(y=4, x=6) # 調用傳參,正確
factorial(x=1, 5) # 錯誤
仔細觀察上面代碼中的傳參方式,這時候我們發現,傳遞的參數只有兩種:
- factorial(3, 5),這里的3和5稱為普通位置參數(positional),
- factorial(2, y=5),這里的2是普通位置參數,y=5稱為關鍵字參數(keyword)
實參傳參的參數類型只有這兩種,但是有一些規則:
- 普通位置參數要在關鍵字參數之前,比如上面的factorial(2, y=5)是正確的;factorial(x=1, 6)是錯誤的
- 如果都是普通位置參數,只能按照順序傳參,如上面的factorial(3, 5),x對應着3,y對應着5 , 但是如果都是關鍵字傳參,則順序可以不同,如上面的factorial(y=4 , x=6)
形參的各種規則
形參(即函數在定義時用來占位置的參數)可以分為1、不帶缺省值的參數、2、帶缺省值的參數、3、可變位置參數、4、可變關鍵字參數、5、key-word only參數
1、不帶缺省值的參數
在上面我們定義的factorial中的兩個參數稱為不帶缺省值的參數,下面代碼也是:
def hello(x, y): # x和y都是不帶缺省值的參數,調用時必須傳參,不然報錯
print('這是', x, y)
2、帶缺省值的參數
def ex(w=5): # 這是一個帶缺省的參數w,如果傳參了就是用傳入的參數,如果沒傳參就使用缺省值5
print("如果沒傳參就用缺省值噢", w)
3、可變位置參數
有缺省值的形參和沒有缺省值的形參,我們都可以通過位置傳參傳入,也可以通過關鍵字傳參傳入(上面講的兩種傳參方式都可以),如果通過位置傳參傳入的參數過多,多余的會被收集到args中,並且在args中生成一個元組tuple,*args可以接收0個或多個位置參數,可變位置參數的定義是前面加一個 *
在函數定義時,沒有缺省值的形式參數一定要放在有缺省值的形參之前,不然會報錯
def f1(x, y=4, *args):#這里args就是一個可變位置參數
print([x, y, args])
f1(3, 5, 2, 7) # 3給x, 5給y,2、7都給args
4、可變關鍵字參數
有缺省值的形參和沒有缺省值的形參,我們都可以通過位置傳參傳入,也可以通過關鍵字傳參傳入(上面講的兩種傳參方式都可以),如果通過關鍵字傳參傳入的參數過多,多余的會被收集到kwargs中,並且在kwargs中生成一個元組字典,**kwargs可以接收0個或多個關鍵字參數,可變關鍵字參數的定義是前面加兩個 *
**kwargs只能放在形式參數的最后
def f2(x, y=3, *args, **kwargs): # 一般函數形參的格式
print(x, y, args, kwargs)
f2(4,3,2,5,z=6,g=3)# 4給了x, 3給了y, 2,5給了args, z=6,g=3給了kwargs
5、key-word only參數
從名字就可以看出,傳參時只能接收keyword(關鍵字傳參),放在*args和**kwargs中間:
在前面講到說,沒有缺省值的一定要放到有缺省值的后面,但是在key-word only參數中,則無所謂順序,因為都必須通過關鍵字傳參
def test(x, y, *args, z=4, s, **kwargs):# z 和 s 是key-word only形式參數
print(x,y,args, z, s, kwargs)
test(3, 2, 5, z=5, s=4, y=7) # 3給了x,2給了y, 5給了args,z=5和s=4給了z和s,y=7給了kwargs
因為key-word only參數只能放在*args后面,如果我們定義時,不想設置可變位置參數,但是需要key-word only參數,只需要在key-word only參數之前加一個 *
def a(x, *, w): # w是key-word only參數
print(x,w)
a(6, w =3) # w只能使用keyword傳參方式
總結:
def func(x, y, *args, z=4, e, **kwargs):
我們把這個定義的形式記住即可,即函數定義時,形式參數有五種,傳參時兩種,多寫代碼測試就能記住靈活使用了。