函數的參數
定義函數(參數):
普通參數,預設參數,可變參數(可變位置參數,可變關鍵字參數),keyword-only 參數
調用函數(傳參):
位置參數,關鍵字參數,參數結構(位置參數解構,關鍵字參數解構)
普通參數 x,y:
def add(x,y)
return x + y
預設參數 x=1:
def inc(base,x =1):
return base +x
inc(3)
4
inc(3,2)
5
參數可以有預設值, 但當一個參數有預設值時,調用時如果不傳遞此參數,會使用預設值
帶預設值參數必須在不帶預設值參數之後,否則會報錯SyntaxError
def inc(x=0,y):
return x+y
File "<ipython-input-19-d6c7b4f89658>", line 1 def inc(x= 0,y): ^SyntaxError: non-default argument follows default argument
可變位置參數:
定義參數時前面加一個*,表示這個參數是可變的,可以接受任意多個參數,這些參數構成一個元組,只能通過位置參數傳遞
可變關鍵字參數:
定義參數時,在前面加**,表示這個參數可變,可以接受任意多個參數,這些參數構成一個字典,只能通過關鍵字參數傳遞
參數的混合使用:
#位置參數可以和關鍵字參數一起使用
#當位置可變參數和關鍵字可變參數一起使用時候,可變位置參數必須在前
def fn(*args,**kwargs):
print(args)
print(kwargs)
fn(1,2,3,x=4,y=5)
(1,2,3)
(1, 2, 3){'y': 5, 'x': 4}
#普通參數可以和可變參數一起使用,但是傳參的時候必須匹配
def fn(x,y,*args,**kwargs):
print(x)
print(y)
print(args)
print(kwargs)
fn(1,2,3,4,5,a=6,b=7)
1
12(3, 4, 5){'a': 6, 'b': 7}
#關鍵字可變參數不允許在普通參數之前
def fn(**kwargs,x):
print(x)
#上面的方式定義會出錯
#預設參數可以在可變位置參數之前
def fn(x=5,*args):
print(x)
pprint(args)
#位置可變參數可以在普通參數之前,但是在位置可變參數之後的普通參數變成可keyword-only 參數
keyword-only參數:
Python3特性
#在*號之後的參數只能通過關鍵字參數傳遞的叫keyword-only參數
可變位置參數之後的參數也是keyword-only參數
def fn(*,x):
print(x)
fn(1,x=3) #此時x 只能通過關鍵字參數傳遞,如果安裝普通參數傳遞,會被*和可變位置參數吃掉
fn(x=3)
def fn(*args,x):
print(args)
print(x)
#keyword-only 參數可以有預設值
keyword-only 參數可以和預設參數一起出現,不管它有沒有預設值,不管預設參數是不是keyword-only
參數解構:
可以把一個可迭代對象解構成位置參數
參數解構發生在函數調用用,可變參數發生在函數定義的時候
解構的兩種形式:
一個星號*,解構的對象:可迭代對象,解構後的結果,位置參數
兩個星號**,解構的對象:字典,解構的結果,關鍵字參數
關鍵字參數解構,key必須是str類型
def add(a,b):
return a+b
data = [4,3]
print(add(*data)) #位置參數解構
data1 = {'a':3,'b':4}
print(add(**data1)) #關鍵字參數解構