函數定義和調用
def語句定義函數
def 函數名(參數列表):
函數體(代碼塊)
【return 返回值】
python的函數沒有return語句,會隱式返回一個None值。
定義中的參數列表成為形式參數,只是一種符號表達,簡稱形參。
函數的調用
調用方式,函數名加上小括號,括號內寫上實參。
調用時寫的參數是實際參數,簡稱實參。
函數參數
參數調用時傳入的參數要和定義的參數個數相匹配。
- 位置參數
def(x,y,z) 調用使用f(1,2,4)
-----按照參數定義順序傳入實參
- 關鍵字參數
def(x,y,z) 調用使用f(x=1,y=2,z=3) 或者f(z=3,x=1,y=2)
----使用形參的名字來寫入實參的方式,如果使用了形參名字,那么傳參順序就可以和定義順序不同
傳參要求位置參數必須在關鍵字參數之前傳入,位置參數是按位置對應的。
函數參數默認值
定義時,在形參后跟一個值。
def add(x=4,y=5):
return x+y
def add(x=4,y): #沒有缺省值的需要放前面。
return x+y
可變參數
一個形參可以匹配任意個數。
位置參數的可變參數
def add(*nums): sum=0 print(type(nums)) for x in nums: sum=sum+x return sum print(add(3,6,9))
<class 'tuple'>
18
在形參前使用*表示該形參是可變參數,可以接收多個實參。
收集多個實參為一個tuple.
關鍵字參數的可變參數
1 def showconfig(**kwargs): 2 for k,v in kwargs.items(): 3 print("{}={}".format(k,v)) 4 print(showconfig(x=2,y=3))
x=2
y=3
形參前使用**符號,表示可以接收多個關鍵字參數。
收集的實參名稱和值組成1個字典。
可變參數的混合使用
總結
有位置可變參數和關鍵字可變參數;
位置可變參數在形參前使用*,關鍵字可變參數在形參前使用**;
位置可變參數和關鍵字可變參數都可以收集若干個實參,位置可變參數收集形成1個tuple,關鍵字可變參數收集形成1個dict;
混合使用參數的時候,可變參數要放到參數列表的最后。普通參數需要放到參數列表前面,位置可變餐宿要放到關鍵字可變參數之前。
keyword-only參數(python3加入)
如果在一個*后,或者一個位置可變參數后出現的普通參數,實際上不是普通的參數了,而是keyword-only參數。
1 def foo(*args,x): 2 print(args) 3 print(x) 4 foo(3,5) #報錯,foo() missing 1 required keyword-only argument: 'x',相當於args已經截獲了所有的位置參數, 5 foo(3,5,7) #報錯 6 foo(3,5,x=7)
def(**kwagrs,x) #報語法錯誤,可以理解為kwargs會截獲所有與的關鍵字參數,就算是寫了x=5,x也永遠得不到這個值。
def fn(*,x,y)
print(x,y)
fn(x=5,y=6)
*之后,普通參數都變成了必須給出的keyword-ony參數。
可變參數和參數默認值
1 def fn(*args,x=5): 2 print(x) 3 print(args) 4 5 fn() 6 fn(6) 7 fn(x=6) 8 fn(1,2,3,x=10)
1 def fn(y,*args,x=5): 2 print("x={},y={}".format(x,y)) 3 print(args) 4 5 fn() #缺失位置參數y 6 fn(5) 7 fn(x=6) #缺失位置參數y 8 fn(1,2,3,x=10) 9 fn(y=17,2,3,x=10) #位置參數要放到關鍵字參數前面 10 fn(1,2,y=3,x=10) #重復給y賦值
1 def fn(x=5,**kwargs): 2 print('x={}'.format(x)) 3 print(kwargs) 4 5 fn(y=6,x=8) 6 fn(5,y=7)
函數參數
參數規則
參數列表一般順序是普通參數,缺省參數,可變位置參數,keyword-only參數(可帶缺省值),可變關鍵字參數。
def fn(x,y,z=3,*args,m=4,n,**kwargs)