目錄
定義函數
空函數
參數檢查
返回多個值
調用函數
函數的參數(未完)
位置參數
默認參數
可變參數
命名關鍵字參數(未完)
遞歸函數
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重復利用率。
格式:
def 函數名():
代碼
如果想定義一個什麼事也不做的空函數,可以用pass
語句(pass
可以用來作為占位符):
def nop():
pass
調用函數時,如果參數個數不對,Python解釋器會自動檢查出來,並拋出TypeError。
但是如果參數類型不對,Python解釋器就無法幫我們檢查。
返回值是一個tuple!但是,在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。
格式:
函數名()
每次調用函數時,函數都會從頭開始執行,當這個函數中的代碼執行完畢後,意味著調用結束了。當然了如果函數中執行到了return也會結束函數。
例:
power(x) #x即為位置參數
當括號裡有兩個以上的參數時,實參要按照形參的順序擺放,傳入。
默認參數可以簡化函數的調用。最大的好處是能降低調用函數的難度。
def enroll(name,city='Beijing'):
print('name:',name)
print('city:',city)
enroll('Jim')
注意:
一是必選參數在前,默認參數在後,否則Python的解釋器會報錯(思考一下為什麼默認參數不能放在必選參數前面);
二是如何設置默認參數。
當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作為默認參數。
在Python函數中,還可以定義可變參數。顧名思義,可變參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。
要定義出這個函數,我們必須確定輸入的參數。由於參數個數不確定,我們首先想到可以把a,b,c……作為一個list或tuple傳進來。但是調用的時候,需要先組裝出一個list或tuple。
定義可變參數和定義一個list或tuple參數相比,僅僅在參數前面加了一個*
號。在函數內部,參數numbers
接收到的是一個tuple,因此,函數代碼完全不變。但是,調用該函數時,可以傳入任意個參數,包括0個參數。
*nums
表示把nums
這個list的所有元素作為可變參數傳進去。
對於關鍵字參數,函數的調用者可以傳入任意不受限制的關鍵字參數。至於到底傳入了哪些,就需要在函數內部通過kw
檢查。
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。
使用遞歸函數需要注意防止棧溢出。解決遞歸調用棧溢出的方法是通過尾遞歸優化,事實上尾遞歸和循環的效果是一樣的,所以,把循環看成是一種特殊的尾遞歸函數也是可以的。
尾遞歸是指,在函數返回的時候,調用自身本身,並且,return語句不能包含表達式。這樣,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次,都只占用一個棧幀,不會出現棧溢出的情況。