Python中的函數(shù)參數(shù)傳遞問題
一、前言
在調(diào)用函數(shù)時,大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)函用之間有數(shù)據(jù)傳遞關系,這就是有參數(shù)的函數(shù)形式。
函數(shù)參數(shù)的作用是傳遞數(shù)據(jù)給函數(shù)使用,函數(shù)利用接收的數(shù)據(jù)進行具體的操作處理。
函數(shù)參數(shù)在定義函數(shù)時放在函數(shù)名稱后面的一對小括號中,如圖所示:
二、了解形式參數(shù)和實際參數(shù)
在使用函數(shù)時,經(jīng)常會用到形式參數(shù)(形參)和實際參數(shù)(實參)。
兩者都叫做參數(shù)二者之間的區(qū)別先通過形式參數(shù)和實際參數(shù)的作用來進行講解,再通過比喻進行理解。
1.通過作用理解
形式傳參和實際參數(shù)在作用上的區(qū)別如下:
- 形式傳參:在定義函數(shù)時,函數(shù)名后面括號中的參數(shù)為“形式參數(shù)”,也稱形參。
- 實際參數(shù):在調(diào)用一個函數(shù)時,函數(shù)名后面括號中的參數(shù)為“實際參數(shù)”。也就是將函數(shù)的調(diào)用者提供給函數(shù)的參數(shù)稱為實際參數(shù),也稱為實參。
根據(jù)實參的類型不同,可以分為將實參的值傳遞個形參,和將實參的引用傳遞給形參兩種情況。
- 當實參為不可變對象時,進行的是值傳遞
- 當實參為可變對象時,進行的是引用傳遞
值傳遞和引用傳遞的基本區(qū)別:
- 進行值傳遞后,改變形參的值,實參的值不變
- 進行引用傳遞后,改變形參的值,實參的值也一同改變
實例:
# 定義函數(shù) def demo(obj): print("原值:", obj) obj += obj # 調(diào)用函數(shù) print("==========值傳遞==========") mot = "唯有在被追趕的時候,你才能真正地奔跑" print("函數(shù)調(diào)用前:", mot) demo(mot) # 采用不可變對象-字符串 print("函數(shù)調(diào)用后:", mot) print("==========引用傳遞==========") list1 = ["小白", "小名", "小紅"] print("函數(shù)調(diào)用前:", list1) demo(list1) # 采用可變對象-列表 print("函數(shù)調(diào)用后:", list1)
運行結(jié)果如下:
2.通過比喻來理解形參和實參
函數(shù)定義時參數(shù)列表中的參數(shù)就是形參,而函數(shù)調(diào)用時傳遞進來的參數(shù)就是實參,就像劇本選主角一樣,劇本的角色相對于形參,而演角色的演員就相對于實參。
三、位置參數(shù)
位置參數(shù)也稱必備參數(shù),必須按照正確的順序傳到函數(shù)中。即調(diào)用時的數(shù)量和位置必須和定義時是一樣的。
1.數(shù)量必須與定義時一致
在調(diào)用函數(shù)時,指定的實參數(shù)量必須與形參一致,否則將拋出TypeError異常,提示缺少必要的位置參數(shù)。
例如:定義一個函數(shù)def fun_bmi(person, height, weight),該函數(shù)中有3個參數(shù),但調(diào)用時只傳兩個參數(shù),如下代碼所示:
def fun_bmi(person, height, weight): """ 功能:根據(jù)身高和體重計算BMI指數(shù) :param person: 姓名 :param height: 身高,單位:米 :param weight: 體重,單位:千克 """ print(person + "的身高:" + str(height) + "米\t 體重:" + str(weight) + "千克") bmi = weight / (height * height) # 用于計算BMI指數(shù),公式為“體重/身高的平方” print(person + "的BMI指數(shù)為:" + str(bmi)) # 判斷身材是否合理 if bmi < 18.5: print("您的體重過輕") if 18.5 <= bmi < 24.9: print("正常范圍,注意保持") if 24.9 <= bmi < 29.9: print("您的體重過重") if bmi > 29.9: print("肥胖") fun_bmi("路人甲", 183)
運行結(jié)果如下:
如上圖所示,拋出TypeError,具體意思是“fun_bmi()方法缺少一個必要的位置參數(shù)weight”。
2.位置必須與定義時一致
在調(diào)用函數(shù)時,指定的實參位置與形參的位置一致,否則將產(chǎn)生一下兩個結(jié)果:
- 拋出TypeError異常產(chǎn)
- 生結(jié)果與預期不符的問題
拋出異常的情況主要是因為在調(diào)用函數(shù)時,如果指定的實參與形參的位置不一致,但是他們的類型一致,那么就不會拋出異常,而是產(chǎn)生結(jié)果與預期不符的問題。
例如,下列代碼:
def fun_bmi(person, height, weight): """ 功能:根據(jù)身高和體重計算BMI指數(shù) :param person: 姓名 :param height: 身高,單位:米 :param weight: 體重,單位:千克 """ print(person + "的身高:" + str(height) + "米\t 體重:" + str(weight) + "千克") bmi = weight / (height * height) # 用于計算BMI指數(shù),公式為“體重/身高的平方” print(person + "的BMI指數(shù)為:" + str(bmi)) # 判斷身材是否合理 if bmi < 18.5: print("您的體重過輕") if 18.5 <= bmi < 24.9: print("正常范圍,注意保持") if 24.9 <= bmi < 29.9: print("您的體重過重") if bmi > 29.9: print("肥胖") fun_bmi("路人甲", 60, 183)
運行結(jié)果如下:
函數(shù)調(diào)用后,沒有拋出異常,但是從結(jié)果看,產(chǎn)生結(jié)果與預期結(jié)果不一致。
四、關鍵字參數(shù)
關鍵字傳參是指使用形參的名字來確定輸入的參數(shù)。通過該方式指定實參時,不需要與形參位置一致,只要參數(shù)名稱寫正確即可。
例如:調(diào)用def fun_bmi(person, height, weight)函數(shù),通過關鍵字傳參,代碼如下:
fun_bmi(height=1.83, weight=60, person="路人甲")
調(diào)用函數(shù),將顯示如下結(jié)果:
從上面結(jié)果可以看出,雖然指定實際傳參時,順序與函數(shù)定義時不一致,但是運行結(jié)果與預期結(jié)果是一致的。
五、為參數(shù)設置默認值
調(diào)用函數(shù)時,如果沒有指定某個參數(shù)將拋出異常,即在定義函數(shù)時,直接指定形式參數(shù)的默認值。
這樣,當沒有傳入?yún)?shù)時,則直接使用定義函數(shù)時設置的默認值。
語法格式如下:
def functionname(...,[parameter1 = defaultvalue1]):[functionbody]
參數(shù)說明:
functionname
:函數(shù)名稱,在調(diào)用時使用parameter1 = defaultvalue1
:可選參數(shù),用于指定向函數(shù)中傳遞的出納室,并且為該參數(shù)設置默認值為defaultvalue1functionbody
:可選參數(shù),用于指定函數(shù)體,即該函數(shù)被調(diào)用后,要執(zhí)行的功能代碼
注意:在定義函數(shù)時,指定默認的形參必須在所有參數(shù)的最后,否則將產(chǎn)生語法錯誤。
使用可變對象作為函數(shù)參數(shù)的默認值時,多次調(diào)用可能會導致意料之外的情況,例如,編寫一個名稱為demo()的函數(shù),并為其設置一個帶默認值的參數(shù),代碼如下:
def demo(obj=[]): print("obj的值:", obj) obj.append(1)
調(diào)用demo()函數(shù),代碼如下:
demo() # 調(diào)用函數(shù)
將顯示以下結(jié)果:
連續(xù)兩次調(diào)用,并不指定實際參數(shù),代碼如下:
demo() # 調(diào)用函數(shù) demo() # 調(diào)用函數(shù)
將顯示以下結(jié)果:
從上面結(jié)果看,這顯然不是我們想要的結(jié)果,為了防止出現(xiàn)這種情況,最好使用Nome作為可變對象的默認值,這時還需要代碼檢查。修改后的代碼如下:
def demo(obj=None): # 定義一個函數(shù) if obj == None: # 判斷是否為空 obj = [] print("obj的值:", obj) # 輸出obj值 obj.append(1) # 連續(xù)調(diào)用并輸出
這時在連續(xù)兩次調(diào)用函數(shù)demo()函數(shù),將顯示以下運行結(jié)果:
六、可變參數(shù)
定義可變參,主要有兩個形式:
- *
parameter
- **
parameter
1.*parameter
這種形式表示接收任意多個實際參數(shù)并將放到一個元組中。例如,定義一個函數(shù),讓其可以接收任意多個實際參數(shù),代碼如下:
def printplayer(*name): # 定義輸出我喜歡的NBA球員的函數(shù) print("\n我喜歡的NBA球員有:") for item in name: print(item) # 輸出球員名稱
調(diào)用3次上面的函數(shù),分別指定不同個數(shù)的實際參數(shù),代碼如下:
printplayer("小紅") printplayer("小紅", "小白") printplayer("小紅", "小白", "小明")
執(zhí)行結(jié)果如下:
2.**parameter
這個形式表示接收任意多個顯式賦值的實際參數(shù),并將其放到一個字典中。例如,定義一個函數(shù),讓其可以接收任意多個顯式賦值的實際參數(shù),代碼如下:
def printsign(**sign): # 定義輸出姓名和綽號的函數(shù) print() # 輸出一個空行 for key, value in sign.items(): # 遍歷字典 print("[" + key + "]的綽號是:" + value) # 輸出組合獲得信息
調(diào)用兩次printsign()函數(shù),代碼如下:
printsign(小紅="妖精", 小明="大聰明") printsign(小白="菜雞", 小李="不高興", 小張="沒頭腦")
執(zhí)行結(jié)果如下:
如果想要使用一個已經(jīng)存在的字典作為函數(shù)的可變參數(shù),可以在字典的名稱前加“**”。例如下面代碼:
dict1 = {"小白": "菜雞", "小李": "不高興", "小張": "沒頭腦"} # 定義一個字典 printsign(**dict1) # 通過字典指定函數(shù)的可變參
執(zhí)行結(jié)果如下:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python數(shù)據(jù)結(jié)構(gòu)之線性表的順序存儲結(jié)構(gòu)
這篇文章主要為大家詳細介紹了python數(shù)據(jù)結(jié)構(gòu)之線性表的順序存儲結(jié)構(gòu),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09從Pytorch模型pth文件中讀取參數(shù)成numpy矩陣的操作
這篇文章主要介紹了從Pytorch模型pth文件中讀取參數(shù)成numpy矩陣的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03