Pyhton函數給編寫程序帶來了便捷性,開發人員可以把程序的共用代碼,或者說是程序的通用功能封裝成函數。當需要使用函數時,只需要在代碼的相應位置調用函數即可。
在《初識Python函數編程與代碼的可復用性》一文中,我們已經了解了如何定義一個函數和調用函數。但對函數參數的傳遞沒有詳細討論,本文主要討論函數參數的傳遞。
函數中的參數起到了傳遞數據的作用,函數調用者可以通過函數參數把函數內部需要的數據從外部傳遞過去。例如下面的代碼定義了函數summation,它有一個參數number,函數需要這個參數來計算自然數的累加和。調用者調用函數時,需要傳入一個自然數進去。
在上面的代碼中,聲明summation函數語句的參數稱為形參,調用summation函數時傳入的參數稱為實參,例如在summation函數中,函數聲明語句的number是形參,後面的代碼調用summation函數傳入的自然數10、20、100是實參。這裡需要注意的是,函數聲明時的形參數量和調用函數時傳入的實參數量要一致,聲明的形參順序和傳入的實參順序也要一致。
一般說來定義多少個形參,就需要傳入多少個實參。在一些特殊情況下,函數雖然定義了形參,但在調用函數時可以不用傳入實參,這就是默認參數的作用。默認參數的意思就是給函數的形參設置一個默認值,如果在調用函數時沒有傳入實參,那麼這個默認值將會作為實參傳遞給函數。默認參數可以簡化函數的調用,調用者不需要傳入過多的實參。
給函數設置默認參數時要遵循該參數具有共性和不變屬性的規則,在特殊情況下可以用傳入的實參代替默認值。例如在一個計算銀行利息的函數中,聲明的參數有利率、本金和存款存期,在這三個參數中利率一般是不變的,它具有共性和不變屬性,可以設置為默認參數,當因特殊情況利率發生變化時,可以傳入實參來代替默認值。下面的代碼給出了如何聲明帶有默認參數的函數。
在上面的代碼中,定義了calculation函數,用於計算應付利息。該函數有三個參數,分別是principal(本金)、date(存期)、rate(利率),其中利率為默認參數,默認值是0.05(5%)。默認參數的聲明語法就是在形參名稱後面用運算符「=」給形參賦值。當函數的形參被聲明為默認參數後,調用函數時就可以省略該參數的傳入。這裡需要注意的是,被聲明為默認參數的形參需要放置在不是默認參數的形參後面。
在實際編程中,還會遇到這樣的情況:要求編寫一個函數,實現求多個自然數的平均值。這就有點難度了,求多個自然數的平均值不難,難就難在要用函數來實現,求平均值的自然數個數又不確定,如何聲明函數的形參呢?
這就要用到可變參數了,可變參數允許調用函數時傳入的參數是可變的,可以是1個實參、2個實參或者多個實參,也可以是0個實參。聲明可變參數時,只需要在形參名稱之前加「*」符號即可,調用函數時可以傳入任意個實參。
在上面的代碼中,函數average就使用了可變參數,在函數形參numbers前面加「*」符號,加上「*」符號的numbers不再是單個值,而是一個元組。當調用有可變參數的函數時,Python解釋器會把傳入的多個參數封裝到一個元組裡面,再傳遞給函數。
在形參名稱前面加一個「*」符號,可以讓形參變為一個元組使用。有時我們更希望傳入的可變參數是一個字典,字典是一個鍵值對,類似於JSON數據。Python也支持可變參數作為字典的傳入,語法就是在形參名稱前面加二個「*」符號。
假設要編寫一個輸出用戶信息的函數,用戶信息包含用戶的姓名、年齡、身高等內容,但用戶信息有的完整、有的不完整,輸出的內容不完全相同。這時我們就可以在函數中使用字典類型的可變參數。
在上面的代碼中,聲明了userinfo函數,函數的形參user是字典類型的可變參數,在函數體內部可以把uesr參數直接作為字典來使用。這裡需要注意的是,當形參為字典可變參數時,函數調用時傳入的參數必須是字典數據。
前面主要討論了Python函數參數的使用方法。Python函數支持默認參數,默認參數需要在形參名稱後面使用賦值語句賦值,默認參數不支持字典、列表等內容可變對象。另外聲明默認參數時,需要把聲明的默認參數放置在不是默認參數的形參後面。
Python也支持可變參數,可變參數分為元組類型的可變參數和字典類型的可變參數。元組類型的可變參數是在形參名稱前面加一個「*」符號,字典類型的可變參數是在形參名稱前面加兩個「*」符號。