Python自定義函數
-
- 聲明
- 定義函數
- 調用函數
- 空函數
- 函數傳回值
- 函數參數
-
- 預設參數
- 可變參數
- 關鍵字參數
- 命名關鍵字參數
- 參數組合
- 遞歸函數
-
- 遞歸優化--尾遞歸
- 遞歸的優缺點
聲明
本篇内容是記錄廖雪峰老師的python教程筆記。
原教程網址為:https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888#0
定義函數
使用def定義函數,格式如下:
def f_name(f_para1,f_para2,…):
#此處縮進4格書寫函數體
調用函數
- 同一py檔案下的,可以通過f_name(參數)調用
- 調用另一py檔案下的函數,使用from 檔案名(無py) import f_name
空函數
def empty():
pass
函數傳回值
-
return
傳回None
-
return x
傳回x
-
return x1,x2,x3,…
傳回一個tuple(x1,x2,x3,…)
函數參數
預設參數
def test(x,y=2)
此時預設y的值為2,在調用函數時,可以同時傳入兩個數分别賦給x,y,例如:test(3,3)
也可隻傳一個參數,賦給x,y此時取預設值2 ,例如:test(3)
預設參數必須指向不變對象(不變對象一旦建立,對象内部的資料就不能修改,減少了由于修改資料導緻的錯誤)
可變參數
在參數前面加入==*==号,表示傳入參數個數不确定,可以傳入任意個參數,包括0個參數。
這些可變參數,在函數調用時自動組裝為一個tuple。
關鍵字參數
允許傳入0/人一個含參數名的參數,這些關鍵字參數在函數内部自動組裝為一個dict
在參數前面加入==**==号,表明這是一個關鍵字參數。
命名關鍵字參數
閑置關鍵字參數的名字,例如隻接受city和job作為關鍵字參數,定義的函數如下:
def person(name, age, , city, job):
*後面的參數被視為命名關鍵字參數。
如果函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就不再需要一個特殊分隔符了。
命名關鍵字參數必須傳入參數名,這和位置參數不同。如果沒有傳入參數名,調用将報錯:
命名關鍵字參數可以有預設值,進而簡化調用;
參數組合
5種參數可以組合使用,但是,參數定義的順序必須是:必選參數、預設參數、可變參數、命名關鍵字參數和關鍵字參數
遞歸函數
遞歸優化–尾遞歸
為了防止棧溢出,将遞歸優化為尾遞歸,在return時不傳回表達式,僅傳回遞歸函數本身。
遺憾的是,大多數程式設計語言沒有針對尾遞歸做優化,Python解釋器也沒有做優化,是以,即使把上面的fact(n)函數改成尾遞歸方式,也會導緻棧溢出。
遞歸的優缺點
優點:邏輯簡單清晰
缺點:過深調用會導緻棧溢出