函數的參數分爲形參和實參
形參:函數定義時定義的參數叫做形參,相當於變量名
實參:函數調用時傳遞的參數叫做實參,相當於變量值
形參和實參的關係:
- 函數調用時,實參(變量值的內存地址)綁定形參(變量名)
- 上述綁定關係只能在函數體內調用
- 綁定關係在函數調用時生效,函數調用結束後解除綁定關係
一.形參
1.位置參數
位置形參:按照從左到右的順序依次定義的變量名
特點:必須傳參,多一個少一個都不行
示例代碼1:
def func(x,y):
print(x,y)
func(1,2) 結果爲:1,2
示例代碼2:
def func(x,y):
print(x,y)
func(1)
結果爲:
y沒有傳值
示例代碼3:
def func(x,y):
print(x,y)
func(1,2,3)
結果爲:
需要兩個但是我們傳了三個
2.默認值參數
默認值參數也叫默認值形參,以key=value的形式在函數定義階段給形參賦值
特點:默認值參數可以不傳參,默認值最好是一個不可變類型
示例代碼1:
def func(x,y=1):
print(x,y)
func(1,2) 結果爲:1,2
func(1) 結果爲:1,1
示例代碼2:
a = "哈哈哈"
def func(x,y=a):
print(x,y)
a = "呵呵呵"
func(1) 結果爲:1,哈哈哈
結果與我們想象相同,因爲a是一個不可變類型,函數外的代碼不會對a產生影響,也就不會影響函數的結果。
示例代碼3:
a = [1]
def func(x,y=a):
print(x,y)
a.append(2)
func(1) 結果爲:1,[1,2]
我們理想中y的值應該是[1,2],但是a是一個可變類型,函數體外的代碼影響了a,即影響了函數的結果,這不算一個合格的函數。
如果a是一個不可變類型就不會出現類型的情況,所以默認值最好爲不可變類型。
3.動態參數
動態參數也叫動態形參,當實參的個數不確定時,我們就需要可變長度的形參來接受實參
1.瞭解 * 和 **
* 和 ** 在形參表示聚合,*將位置參數聚合成元組,**將位置參數聚合成字典
* 和 ** 在實參表示打散,*將可迭代對象打散成多個位置參數,**將字典打散爲多個關鍵字參數
2.*args
*args是動態的位置參數,可以接受不定長的位置參數,將多個位置參數聚合成元組
ps:*args的參數名是args,*只是聚合的作用
def func(*args):
print(args)
func(1,2,3,4) 結果爲:(1,2,3,4)
3.**kwargs
**kwargs與*args類似,只不過是接受不定長的關鍵字參數,將多個關鍵字參數聚合成字典
def func(**kwargs):
print(kwargs)
func(a=1,b=2,c=3) 結果爲:{"a":1,"b":2,"c":3}
4.無敵傳參
def func(*args,**kwargs):
...
這樣定義的函數無論多少個位置參數和關鍵字參數都可以接受
5.參數順序:
位置形參,動態位置形參,默認值形參,**kwargs
實例代碼1:
def func(*args,a):
print(args,a)
func(1,2,3) 會報錯,因爲args是動態的,將所有的位置參數接受完了,a就接收不到值,所以位置參數必須放在*args後
實例代碼2:
def func(**kwargs,a=1):
print(kwargs,a)
func(a=1,b=2,c=3) 會報錯,語法錯誤,默認值參數和位置參數不能放在**kwargs後
5.總結
- args是arguments(參數),kwargs是keyword arguments(關鍵字參數),當然這兩個名稱可以是別的,但是約定俗稱我們使用這兩個。
- 形參順序: func(位置參數,**args,默認值參數,**kwargs)
二.實參
1.位置參數
位置實參:按照從左到右的順序依次給形參傳值
特點:按照順序與形參一一對應
def func(x,y):
print("x:",x)
print("y:",y)
func(1,2) 結果爲:x:1 y:2
2.關鍵字參數
關鍵字參數也叫關鍵字實參,以key=vlaue的形式給形參傳值
特點:
- 指名道姓的給形參傳值,不受順序的影響
- 如果和位置實參混用,必須放在位置實參的後面
- 不能給一個形參重複傳值
示例代碼1:
def func(x,y):
print(x,y)
func(x=1,y=2) 結果爲:1,2
func(y=1,x=2) 結果爲:2,1
示例代碼2:
def func(x,y):
print(x,y)
func(1,y=3) 結果爲:1,3
示例代碼3:
def func(x,y):
print(x,y)
func(x=3,1)
結果爲:
語法錯誤,關鍵字參數必須跟在位置參數後
示例代碼4:
def func(x,y):
print(x,y)
func(1,x=2)
結果如下: