函數(shù)參數(shù)的使用
一、形參與實參介紹
#形參:在定義函數(shù)階段定義的參數(shù)稱之為形式參數(shù)翠忠,簡稱形參,相當(dāng)于變量名
def? func(x,y):???????? #x = 1??? y = 2
???????? print(x,y)
#實參:在調(diào)用函數(shù)階段傳入的值稱之為實際參數(shù)若债,簡稱實參充坑,相當(dāng)于變量值
#func(1,2)
#形參與實參的關(guān)系
1、在調(diào)用階段泽本,實參(變量值)會綁定給形參(變量名)
2淘太、這種綁定關(guān)系只能在函數(shù)體內(nèi)使用
3、實參與形參的綁定關(guān)系在函數(shù)調(diào)用時生效,函數(shù)調(diào)用結(jié)束后解除綁定關(guān)系
#實參是傳入的值琴儿,但值可以是以下形式
形式一:
???????? func(1,2)
形式二:
???????? a= 1
???????? b= 2
???????? func(a,b)
形式三:
func(int(“1”),2)
func(func1(1,2,),func2(2,3),333)
二段化、形參與實參的具體使用
1、位置參數(shù):按照從左到右的順序依次定義的參數(shù)稱之為位置參數(shù)
???????? 位置形參:在函數(shù)定義階段造成,按照從左到右的順序直接定義的“變量名”
?????????????????? 特點:必須被傳值显熏,多一個不行少一個也不行
def? func(x,y):
???????? print(x,y)
func(1,2)
???????? 位置實參:在函數(shù)調(diào)用階段,按照從左到右的順序依次傳入的值
?????????????????? 特點:按照順序與形參一一對應(yīng)
func(1,2)
func(2,1)
2晒屎、關(guān)鍵字參數(shù)
關(guān)鍵字實參:在函數(shù)調(diào)用階段喘蟆,按照key=value的形式傳入的值
???????? 特點:指名道姓結(jié)某個形參傳值,可以完全不參照順序
???????? def? func(x,y):
?????????????????? print(x,y)
???????? func(y=2,x=1)
???????? func(1,2)
#混合使用鼓鲁,強調(diào)
1蕴轨、位置實參必須放在關(guān)鍵字實參前
func(1,y = 2)
fcun(y=2,1)?#語法錯誤
2、不能為同一個形參重復(fù)傳值
func(1,y=2,x=3) #1已經(jīng)給了x骇吭,x=3等于復(fù)復(fù)傳值橙弱,會報錯
3、默認(rèn)參數(shù)
默認(rèn)形參:在定義函數(shù)階段燥狰,就已經(jīng)被賦值的形參棘脐,稱之為默認(rèn)參數(shù)
???????? 特點:在定義階段就已經(jīng)被賦值,意味著在調(diào)用階段可以不用為其賦值
???????? deffunc(x,y=3):
?????????????????? print(x,y)
???????? #func(x=1)
???????? #func(x=1,y=333)? 非想傳值也可以
???????? def? register(name,age,gender=”男”):
?????????????????? print(name,age,gender)
???????? register(“老大”,18)
???????? register(“老二”龙致,19)
???????? register(“老三”蛀缝,20)
#位置形參與默認(rèn)形參混用,強調(diào):
1目代、位置形參必須在默認(rèn)形參的左邊
???????? def? func(x,y=2):
?????????????????? pass
2屈梁、默認(rèn)參數(shù)的值是在函數(shù)定義階段被賦值的,準(zhǔn)確地說被賦予的是值的內(nèi)存地址
m = 2
def func(x,y =m):
???????? print(x,y)
func(1)
3榛了、雖然默認(rèn)值可以被指定為任意數(shù)據(jù)類型在讶,但是不推薦使用可變類型
???????? 函數(shù)最理想的狀態(tài):函數(shù)的調(diào)用只跟函數(shù)本身有關(guān),不受外界代碼的影響
???????? def? func(x,y,z,l=None):
?????????????????? ifl is None:
??????????????????????????? l= []
?????????????????? l.append(x)
?????????????????? l.append(y)
?????????????????? l.append(z)
?????????????????? print(l)
???????? func(1,2,3)
???????? new_l= [11,22]
???????? func(1,2,3,new_l)
???????? 4忽冻、可變長度的參數(shù)(*與**的用法)
?????????????????? 可變長度指的是在調(diào)用函數(shù)時真朗,傳入的值(實參)的個數(shù)不固定
?????????????????? 而實參是用來為形參賦值的,所以對應(yīng)著針對溢出的實參必須有對應(yīng)的形參來接收
???????? 可變長度的位置參數(shù)
?????????????????? *形參名:用來接收溢出的位置實參僧诚,溢出的位置實參會被*保存成元組的格式然后賦值緊跟其后的形參名遮婶,*后跟的可以是任意名字,但是約定俗成應(yīng)該是args
???????? deffunc(x,y,*z):
?????????????????? print(x,y,z)
???????? func(1,2,3,4,5,6)
???????? def? sum(*args):
?????????????????? res= 0
?????????????????? foritem in args:
??????????????????????????? res+=item
?????????????????? returnres
???????? res= sum(1,2,3,4)
???????? print(res)
?????????????????? *可以用在實參中湖笨,實參中帶*旗扑,先*后的值打散成位置實參
???????? def? func(x,y,z):
?????????????????? print(x,y,z)
???????? func(*[11,22,33])
???????? l= [11,22,33]
???????? func(*l)
形參與實參中都帶*
??????????????????????????? def? func(x,y,*args):
???????????????????????????????????? print(x,y,args)
??????????????????????????? func(1,2[3,4,5,6])
??????????????????????????? fimc(1,2,*[3,4,5,6])
??????????????????????????? func(*hello)
???????? 可變長度的關(guān)鍵字參數(shù)
**形參名:用來接收溢出的關(guān)鍵字實參,**會將溢出的關(guān)鍵字實參保存成字典格式慈省,然后賦值給緊跟其后的形參名
**后跟的可以是任意名字臀防,但是約俗成應(yīng)該是kwargs
def? func(x,y,**kwargs):
???????? print(x,y,kwargs)
func(1,y=2,a=1,b=2,c=3)
**可以用在實參中(**后跟的只能是字典),實參中帶**,先**后的值打散成關(guān)鍵字實參
def?func(x,y,z):
???????? print(x,y,z)
func(*{“x”:1,”y”:2,”z”:3})
func(**{“x”:1,”y”:2,”z”:3})? #func(x=1,y=2,z=3)
形參與實參中都帶**
def? func(x,y,**kwargs):
???????? print(x,y,kwargs)
func(y=222,x=111,a=33,b=4)
func(**{“y”:222,”x”:111,”a”:333,”b”:444})
混用*與**:*args必須在**kwargs之前
def? func(x,*args,**kwargs):
?????????????????? print(args)
???????? print(kwargs)
func(1,2,3,4,5,6,7,8,x=1,y=2,z=3)
def index(x,y,z):
???????? print(“index”,x,y,z)
def wrapper(*args,**kwargs):? #args=(1,) kwargs={“z”:3,”y”:2}
???????? index(*args,**kwargs)
???????? #index(*(1,)),**{“z”:3,”y”:2}
???????? #index(1,z=3,y=2)
Wrapper(1,z=3,y=2)? #為wrapper傳遞的參數(shù)是給Index用的
#原格式---》匯總---》打回原形