Sub-programs · 模組化程式設計
點擊任意卡片直接跳轉對應章節
了解模組化設計的核心理念及子程式的四種類型
將複雜問題分解為多個較小、可管理的子問題(模組),逐一處理。在程式設計中,這些模組稱為子程式(在 Python 中稱為函數 function)。每個子程式代表多行程式碼,可以獨立使用,也可以重複呼叫。
沒有輸入參數,也沒有傳回值。通常執行預設程式碼,例如在 Shell 中列印資訊。
有輸入參數但沒有傳回值。對參數進行運算,但不以傳回值形式返回結果。
沒有輸入參數,但有傳回值。可以直接使用程式中的變數進行運算,例如隨機數生成器。
最常見的類型。有輸入參數和傳回值,通常以參數形式傳入數值,並以傳回值形式返回運算結果。
Python 提供許多常用的內置函數:
| 函數 | 描述 |
|---|---|
abs(x) | 傳回 x 的絕對值 |
round(x, y) | 將 x 四捨五入至 y 位小數 |
print() | 輸出至 Shell |
input() | 從用戶讀取輸入 |
int() | 轉換為整數 |
需要先 import math 才能使用:
| 函數 | 說明 |
|---|---|
math.sqrt(x) | 計算 x 的平方根 |
math.sin(x) | 計算 x 弧度的正弦值 |
math.cos(x) | 計算 x 弧度的餘弦值 |
math.exp(x) | 計算自然指數函數 $e^x$ |
需要先 import random 才能使用:
| 函數 | 說明 |
|---|---|
random.random() | 傳回 0 至 1(不含)的隨機浮點數 |
random.uniform(a,b) | 傳回 a 至 b(不含)的隨機浮點數 |
random.randint(a,b) | 傳回 a 至 b 的隨機整數 |
學習如何在 Python 中使用 def 關鍵字定義子程式
每個子程式在被呼叫之前必須先定義。在 Python 中,使用關鍵字 def 來定義子程式:
在括號內列出要傳入子程式的參數。多個參數用逗號分隔;無參數則留空括號。
return 關鍵字結束子程式呼叫並將資料傳回呼叫位置。可傳回一個或多個值。若無需傳回值,則不需要 return。
實際參數 (actual parameters) 也稱為變元 (arguments),即傳入函數的值。子程式必須在被呼叫前定義,否則會出現 NameError。
了解局部變量與全程變量的區別及使用方法
在子程式內宣告的變數。只在該子程式內有效;子程式結束後,所有局部變量將被銷毀。形式參數也屬於局部變量。
在子程式外宣告的變數。其範圍涵蓋整個程式,包括所有子程式。在子程式內可讀取全程變量的值;若要修改其值,必須使用 global 關鍵字。
若在子程式內未使用 global 關鍵字就嘗試修改全程變量,Python 會將其視為一個新的局部變量,從而產生錯誤(UnboundLocalError)。
類比:香港計程車有三種:紅色(市區)、綠色(新界)、藍色(大嶼山)。全程變量就像紅色計程車,可在全港行駛;局部變量就像綠色或藍色計程車,只能在特定區域行駛。
Python 根據實際參數的資料類型決定傳遞方式
整數 (int)、浮點數 (float)、布林值 (bool)、字串 (str) 是不可變物件。
傳入不可變物件時,實際參數的值會被複製到形式參數。子程式內對形式參數的修改不會影響實際參數的值。
列表 (list) 是可變物件。
傳入可變物件時,形式參數儲存實際參數的記憶體位址(指示標 pointer)。子程式內對形式參數的修改會直接反映在實際參數上。
| 實際參數的資料類型 | 物件類型 | 對實際參數的影響 |
|---|---|---|
| int, float, bool, str | 不可變物件 | 不影響 (複製傳遞) |
| list | 可變物件 | 會影響 (參考傳遞) |
增強知識:在 C++ 中,這兩種傳遞方式分別稱為「按值調用 (call-by-value)」和「按址調用 (call-by-reference)」。Python 的行為與 C++ 類似,但由資料類型自動決定。
使用存根來測試和除錯複雜的模組化程式
存根是用簡短、臨時的程式碼代替子程式主體,讓主程式即使在子程式未完成時也能運行。由於存根是簡單程式碼,幾乎不含語法或邏輯錯誤,因此可以縮小檢查範圍,更有效地定位問題。
假設主程式包含三個子程式:計算BMI、分析BMI、製作報告。在測試「製作報告」子程式時,可用存根替代前兩個子程式:
測試你對子程式的掌握程度,共 12 題,即時評分
random.randint(1, 10) 可能返回哪些值?點擊卡片翻轉查看解釋,鞏固關鍵概念
根據教材整理的典型考試題目,附參考答案
mark 儲存 10 名學生的成績:[78, 89, 87, 95, 60, 44, 51, 98, 77, 69]。其中一個子程式是 average(),它返回學生的平均成績。請問呼叫 average() 的傳回值是什麼?
higher(m) 返回成績高於 m 的學生人數。請問呼叫 higher(90) 的傳回值是什麼?(使用上題的成績陣列)
functionA(a, b),該子程式要求用戶輸入兩個整數 a 和 b,然後返回它們的差值。例如,functionA(6, 2) 返回 4,functionA(3, 9) 返回 6。請問呼叫 functionA(5, 10) 的傳回值是什麼?
zodiac(year) 返回給定年份對應的生肖。提示:將年份減去 4 後除以 12,餘數為 0 時生肖為「鼠」,餘數為 1 時為「牛」,依此類推。請問呼叫 zodiac(2013) 的傳回值是什麼?
hex2dec(h) 將十六進制字串轉換為十進制數。偽代碼如下:dec 屬於哪種類型的變數?
dec 是局部變量 (local variable),因為它在子程式 hex2dec(h) 內部宣告,只在該子程式內有效。
image 儲存點陣圖影像。他編寫子程式 avg(i, j) 計算並返回 image[i,j] 至 image[i+1,j+1] 的平均值。請完成偽代碼:
本章所有重要術語的中英文對照及定義
EC4 Sub-programs 互動學習頁面 | 資訊及通訊科技 選修課程