前言
「自定函式」是程式設計者依需求自行定義開發設計。自行定義的函式是一段獨立的程式碼敘述集合區塊,這個敘述區塊稱為Function(函式),建立時要賦予函式名稱。在其它程式敘述只要透過呼叫該函式名稱,就可以使用該函式敘述的功能。
函式的建立
Python定義函式時,是使用def來建立函式名稱,所建立的函式可以傳入多個引數,完成函式執行時也可產生多個傳回值。建立自定函式主體的語法如下:
def 函式名稱(引數1, 引數2,... ... ):
程式區塊
return 傳回值1, 傳回值2,... ...-
函式名稱:函式名稱的命名方式比照識別字的命名規則。在同一個程式中,自定函式的名稱不可以重複定義使用,也不可以和內建函式的名稱相同。
-
引數:引數又稱為參數,可以傳入一個、二個或多個,也可以不傳入引數。在此的引數稱為虛引數,是接收來自呼叫端的程式敘述傳遞過來的資料。呼叫端程式敘述傳入的資料稱為實引數。若傳入之引數是二個以上,引數間要用逗點「,」隔間開。若不傳入引數,這時引數列只留有一個空的
()。 -
傳回值:執行函式的敘述區段從事某項功能或任務時,有時會傳回一個或多個結果,這就是傳回值。而傳回值可以是資料、可以是變數、也可以是運算式,但回傳值最終會是資料常值的結果。使用
return敘述就可以傳回資料結果,若函式的任務是沒有傳回值時,則return敘述可省略。
[例] 定義一個函式主體,函式名稱為 average,傳入兩個整數引數n1、n2,傳回值是兩的引數的平均值,傳回值使用a浮點數變數。(檔名:function01.py)
程式碼: function01.py
def average(n1, n2): a = (n1 + n2) / 2 return a
說明
第3行:傳回值使用變數a,也可以使用運算式(n1+n2)/2,此種情況可以省略
第2行敘述。即本行可改為:
return (n1 + n2) / 2
函式的呼叫
當在主程式或函式中用敘述呼叫另一個函式去執行一個工作時,我們將前者稱為「呼叫敘述」,後者稱為「被呼叫的函式」(就是上一小節的函式定義主體)。•若前者呼叫敘述小括號內有引數,我們稱為「實引數」(Actual Parameter),被呼叫函式名稱後面小括號內的引數稱為「虛引數」(Formal Parameter)。呼叫敘述呼叫函式的寫法有兩種,一種有傳回值,另一種沒有傳回值:
有傳回值的函式呼叫
變數1, 變數2,... ... = 函式名稱(引數1, 引數2,... ...)-
使用指定運算子「=」,會將等號右邊執行的結果指定給等號左邊的變數。函式可傳回一個或多個結果。
-
引數:在此的引數稱為實引數,是傳遞給所呼叫函式使用的資料。實引數的數量、資料型別,必須和被呼叫函式的虛引數一致。引數若是兩個以上,引數間使用逗號「,」隔開,實引數可以為變數、串列元素、串列,也可以是常值或運算式。引數列若為
0個時,( ) 仍需要保留不可省略。 -
電腦將實引數傳出給被呼叫函式(函式主體)的虛引數,傳入的虛引數將所得到的資料帶入函式主體內,經過運算處理後,在被呼叫函式的最後透過
return敘述傳回一個或多個結果資料給呼叫敘述端的變數。被呼叫函式端的傳回值數量、資料型別,必須和呼叫敘述端的變數一致。
[簡例] 定義一個可以計算兩整數平均值並可傳回計算結果的自定函式, 並完成整個呼叫自定函式的過程。 (檔名:function02.py)
[結果]
輸入第 1 個整數: 11 ↵
輸入第 2 個整數:6 ↵
11 和 6 兩整數平均為:8.5
程式碼: function02.py
# 定義計算平均值的函數 def average(n1, n2): # 計算兩個數字的平均值 a = (n1 + n2) / 2 # 返回平均值 return a print('輸入第 1 個整數:' , end='') # 使用 eval() 讀取使用者輸入的整數 num1 = eval(input()) # 使用 eval() 讀取使用者輸入的整數 num2 = eval(input('輸入第 2 個整數:')) # 計算平均值 avg = average(num1, num2) # 輸出結果,保留一位小數 print(f'{num1} 和 {num2} 兩整數平均為:{avg:.1f}', end = '') ```
[簡例] 定義一個可以計算等差數列的和與末項的自定函式,呼叫函式前使用者須輸入數列的首項、公差、項數,呼叫函式後印出數列的和及數列的末項。 (檔名:function03.py)
[結果]
輸入數列的首項 : 3 ↵
輸入數列的公差 : 2 ↵
輸入數列的項數 : 5 ↵
等差數列的末項為 11,和為 35.0
程式碼: function03.py
# 定義計算等差數列的末項與和的函數 def progress(a1, d, n): # 計算等差數列的末項與和 an = a1 + (n-1) * d # 末項 # 計算等差數列的和 sn = n * (a1 + an) / 2 # 和 # 返回末項與和 return an, sn # 使用者輸入等差數列的首項、公差與項數 a1 = eval(input('輸入數列的首項:')) # 使用者輸入等差數列的公差 d = eval(input('輸入數列的公差:')) # 使用者輸入等差數列的項數 an = eval(input('輸入數列的項數:')) # 計算等差數列的末項與和 an, sn = progress(a1, d, an) # 輸出結果 print(f'等差數列的末項為 {an},和為 {sn}', end = '')
沒有傳回值的函式呼叫
函式名稱(引數1, 引數2,... ...)沒有傳回值的函式呼叫,只是將呼叫敘述端的實引數傳給被呼叫函式端的虛引數。接著,虛引數將所得到的資料帶入函式內經過運算處理後,直接將結果在函式內輸出顯示,不傳回到原來的呼叫敘述。
[簡例] 定義一個能傳入字元和字元數的自定函式,該函式的任務是將所傳入的字元,以所傳入的字元數在函式定義主體內顯示出來,沒有傳回值。呼叫時,實引數分別使用變數、常值、運算式來傳入。(檔名:function04.py)
[結果]
AAAAAAAAAAAA
sssssssssssssss
BBBBBBBBBBBBBBBB程式碼: function04.py
# 定義函數 printChar,輸出指定字元 ch,重複 n 次 def printChar(ch, n): # 使用 for 迴圈重複輸出字元 ch,重複 n 次 for i in range(n): # 使用 f-string 格式化輸出字元 ch,並指定不換行 print (f'{ch}', end = '') # 在輸出完畢後換行 print() # 使用函數 printChar,輸出字元 'A' 重複 12 次 ch1 = 'A' # 使用變數 n1 設定重複次數為 12 n1 = 12 # 使用函數 printChar,輸出字元 'A' 重複 12 次 printChar(ch1, n1) # 實引數使用變數 # 使用函數 printChar,輸出字元 '$' 重複 15 次 printChar('$', 15) # 實引數使用常值 # 使用函數 printChar,輸出字元 'B' 重複 16 次 printChar('B', n1+4) # 實引數使用常值 ```
引數的預設值
-
當自定函式建立時設計需要傳入引數,而呼叫該函式時沒有傳遞引數或傳遞的實引數數量少於虛引數數量,在這種情況下一般是會產生錯誤的。
[例] 引數數量不一致的函式錯誤呼叫。(檔名:
triangle01.py)程式碼: triangle01.py
# 定義計算三角形面積的函數,接收底(B)與高(H)兩個參數 def triangle(B, H): # 計算三角形面積:面積 = (底 * 高) / 2 A = (B * H) / 2 # 回傳計算出來的三角形面積 return A # 設定三角形的底邊長 base = 10 # 設定三角形的高度 height = 5 # 呼叫函數 triangle 並傳入底與高,將計算結果存入 area 變數中 area = triangle(base) # 印出三角形面積結果 print(f"底為 {base}、高為 {height} 的三角形面積為 : {area}") -
要避免造成上面錯誤的情形,只要在宣告函式主體時,將虛引數用=運算子指定預設值即可。若呼叫該函式時沒有傳遞引數或傳遞的實引數數量少於虛引數的數量時,虛引數的預設值就派上用場了。
[簡例] 求三角形面積函式主體建立時,兩個虛引數底與高皆指定預設值。當呼叫該函式時,分別以不傳遞實引數、只傳遞一個實引數或傳遞兩個實引數,來觀察呼叫函式的執行情況。 (檔名:
triangle02.py)[結果]
三角形的底為 10,高為 5 三角形的面積為 25.0 三角形的底為 10,高為 6 三角形的面積為 30.0 三角形的底為 6,高為 6 三角形的面積為 18.0程式碼: triangle02.py
# 定義計算三角形面積的函數 def triangle(B = 6, H = 6): # 計算三角形面積 = (底 * 高) / 2 print() # 輸出三角形的底與高 print(f'三角形的底為{B}, 高為{H}') # 計算三角形面積 A = B * H / 2 # 輸出三角形面積 return A # 使用函數 triangle 計算三角形面積 # 設定三角形的底 base = 10 # 設定三角形的高 high = 5 # 呼叫函數 triangle 並傳入底與高,將計算結果存入 area1 變數中 area1 = triangle(base, high) # 輸出三角形面積結果 print(f'三角形的面積為 {area1}') # 使用函數 triangle 計算三角形面積,僅傳入底,使用預設高 base = 10 # 設定三角形的高 area2 = triangle(base) # 輸出三角形面積結果 print(f'三角形的面積為 {area2}') # 使用函數 triangle 計算三角形面積,使用預設底與高 area3 = triangle() # 輸出三角形面積結果 print(f'三角形的面積為 {area3}') ```
相關主題與延伸閱讀
- 1. 何謂函式:了解函式的基本觀念與自定函式的定位。
- 4. 引數的傳遞方式:延伸學習引數傳遞的傳值呼叫與參考呼叫方式。
- 6. 全域變數與區域變數:了解函式內外變數的有效範圍與生命週期。
- 7. 遞迴:遞迴是自定函式呼叫自己本身的特殊應用。