Pyhton函數篇(一)之函數中的形參與實參
1:什麽是函數
函數其實就是帶名字的代碼塊,用於完成一些具體的工作。如果我們在寫一段程序的時候,需要多次用到同樣的一個功能,如果每次都要重復寫相同的代碼,不僅會增加我們的代碼量,更會讓我們寫出的代碼讓別人看起來覺得很low,而如果我們把功能作為一個代碼塊封裝在一個函數裏,每次僅需要調用這個函數,是不是就很方便了?這就是函數的意義所在
1.1 函數的定義方式
函數的定義使用def關鍵字,如下:
def user(): def 關鍵字後面加函數名定義函數,定義以冒號結尾 """內部代碼塊""" 使用三引號來構成文檔字符串,用來解釋該函數的主要功能,這是一個很好的編碼習慣print("Hello World") 函數體,用來寫該函數需要完成的功能的代碼
user() 使用函數名()的方式調用函數
1.2 向函數傳遞參數信息
在定義函數的時候,可以在函數的()內加入變量,在調用函數的時候就可以給函數傳入對應的值,以上個例子稍作修改:
def user(username): """內部代碼塊""" print("Hello World,"+username) 在定義函數的時候傳入變量username,在調用該函數的時候就可以通過傳值來讓函數實現相應的功能 user("尼古拉斯趙四")
輸出結果:
Hello World,尼古拉斯趙四
2 形參和實參
從名字就可以看出,實參是一個實實在在存在的參數,是實際占用內存地址的,而形參只是意義上的一種參數,在定義的時候是不占內存地址的,如在上面例子中,username就是一個形參,尼古拉斯趙四是我在調用函數時傳入的一個實參,它的值被存儲在形參username中。
函數的調用中,可能存在多個實參,在給函數傳遞參數的時候只要有兩種方式,位置實參和關鍵字實參,每個實參都由變量名和值組成,實參還可以是列表、字典
1.位置實參
在調用函數的時候,必須將每個實參都關聯到函數定義中的每一個形參,最簡單的關聯方式就是基於實參的順序。
def func(x,y,z): 首先在定義函數的時候傳入3個形參x,y,z print(x,y,z) func(3,2,1) 在調用該函數時,通過位置實參的方式,將實參映射到形參,一一對應,即x=3,y=2,z=1
運行結果:
3 2 1
需要註意一點的就是,如果使用位置實參的方式傳值,傳入的實參個數必須與形參相同,否則運行程序會報。
2.關鍵字實參
關鍵字實參是通過關鍵字-值的方式,關鍵字實參的方式就不需要考慮函數調用過程中實參的順序。同一個參數不能傳兩個值
def func(x,y,z): print(x,y,z) func(x=1,y=2,z=3) 通過關鍵字=值的方式,將實參與形參關聯映射,不需要考錄形參的順序,順序也可以改變,即y=2,z=3,x=1 ,運行的結果不會發生改變 運行結果: 1 2 3
3.既有順序,又有關鍵字
def func(x,y,z): print(x,y,z) func(1,y=2,z=3) 在兩種方式混用的時候,順序實參必須要放在關鍵字實參之前,否則會程序報錯,如 1,y=2.3 \ y=2 1,3這種方式都不可行 運行結果: 1 2 3
4.默認值
在定義函數的時候,也可以指定形參的默認值,如果在調用函數時給函數提供了實參時,Python將使用指定的實參值,否則的,將自動調用形參的默認值。因此,如果給形參指定了默認值後,在調用時可以不用給它傳值,使用默認值可以簡化函數的調用。如:
def func(x,y=2): 定義函數的時候在這裏給形參設置了默認值y=2 print(x,y) func(1) 在調用此函數時,只傳入了一個實參,y的值就會使用默認值 運行結果: 1 2
還可以在調用的時候,更改默認值 ,如
def func(x,y=2): print(x,y) func(1,3) 在調用該函數的時候,給設置了默認值的形參y再次賦值,這運行結果會使用新傳入的實參值
運行結果:
1 3
在使用形參默認值的時候需要註意:在形參列表中必須先列出沒有默認值的形參,再列出有默認值的形參。這讓Python依然能夠正確的解讀位置實參。
def func(x=2,y): print(x,y) func(1) 這種情況程序是不允許運行的
即:在函數調用過程中,可以混合使用位置實參,關鍵字實參和默認值參數,但是其中相關的規則一定要遵循,否則一定會導致程序的運行出錯。
當提供的實參多於或少於函數定義時所提供的形參時,程序會報錯,這時只要根據報錯信息正確修改即可。
5.列表和字典
當不確定需要傳入的值是多少時,在定義形參的時候,可以使用*args(列表),**kwargs(字典)來表示。
def func(*args,**kwargs): 使用*args代表列表。**kwargs代表字典,這種形式可以在調用函數的時候傳入多個實參 print(args) print(kwargs) func(*[1,2,3,4,5],**{"y":1}) 如果想要傳入的值以列表或字典的形式顯示出來,就需要在元素前加上*或**
運行結果:
(1, 2, 3, 4, 5)
{‘y‘: 1}
3 函數的返回值
函數不是直接顯示輸出的,相反,它會處理一些數據並返回一個或一組值。在函數中用return語句將值返回到調用函數的代碼行,返回值能將程序大部分繁重的工作移交到函數中去完成,從而簡化主程序。
下面是一個簡單的程序,接收姓氏和名稱,返回完整的人名信息
def name(first_name,last_name): """返回人的姓名""" full_name=first_name+" "+last_name return full_name print(name("尼古拉斯","趙四")) 運行結果: 尼古拉斯 趙四
函數可以返回任何類型的值,包括字典、列表這樣較復雜的數據結構。還是上面的例子,返回一個表示人的字典
def name(first_name,last_name,): """返回人的姓名""" full_name={"first":first_name,"last":last_name} return full_name print(name("尼古拉斯","趙四")) 運行結果為: {‘first‘: ‘尼古拉斯‘, ‘last‘: ‘趙四‘}
函數傳遞列表,傳遞列表在函數中很有用,在列表中包含數字、名字甚至更復雜的對象,下面舉一個例子:
def func(names): """向列表中的所有用戶問號""" for i in names: print("Hello"+" "+i+"!!") func(["劉能","趙四","尼古拉斯"]) 運行結果: Hello 劉能!! Hello 趙四!! Hello 尼古拉斯!!
函數還可以結合while循環,下面是我自己寫的一個很簡單的例子,用戶輸入姓氏和名字,最終輸出完整的一句話。
def name(first_name,last_name,): """返回人的姓名""" full_name=first_name+last_name return full_name while True: print("\nplease tell me your name ") f_name=input("first name:") l_name=input("last name:") print("\n Hello"+name(f_name,l_name)+"!") 輸入姓氏和名字,通過name函數整合後,輸出結果
Pyhton函數篇(一)之函數中的形參與實參