歡迎來到子程式的世界!
在本章中,我們要學習如何成為「懶惰」的程式設計師——當然,這是好的那種!我們不需要重複編寫同樣的程式碼,而是要學習如何將程式碼打包成整潔的小套件,稱為子程式 (Subprograms)。如果現在覺得程式設計像個解不開的謎題,別擔心;看完這些筆記後,你就會明白子程式是如何讓一切管理變得輕鬆多了!
先備知識檢查:在開始之前,請記住程式是一系列給電腦執行的指令清單。而子程式就是儲存在主程式裡,一份較小的指令清單。
1. 什麼是子程式?
子程式是一個能執行特定任務的獨立程式碼區塊。可以把它想像成主程式裡的「迷你程式」。在 Edexcel 的課程大綱中,你會學到兩種主要類型:程序 (Procedures) 和 函數 (Functions)。
「披薩」比喻
想像你在寫一份超級龐大的「披薩派對」食譜。與其每次提到披薩時都重複寫一遍「如何製作麵團」的步驟,你只需要把製作麵團的步驟寫在一個獨立的盒子裡,並命名為 MakeDough。每次你需要用到麵團時,只要指向那個盒子就可以了!這就是子程式運作的方式。
為什麼要使用它們?(好處)
- 分解 (Decomposition): 它能將龐大且令人畏懼的問題,拆解成較小、易於處理的部分。
- 可重用性 (Reusability): 程式碼只需寫一次,就能多次使用。
- 更容易測試: 你可以先測試一個小小的子程式,確認它運作正常,再把它放入主程式中。
- 可讀性 (Readability): 它能讓你的程式碼看起來更整潔,人類讀起來也更容易。
快速回顧:為什麼要使用子程式?為了節省時間、減少錯誤,並讓程式碼更易於閱讀!
2. 程序 (Procedures) 與函數 (Functions)
這在考試中是一個非常重要的區別。雖然它們看起來很像,但有一個主要差異。
程序 (Procedures)
程序是一種執行特定任務,但不會將值傳回主程式的子程式。它只是「完成它的工作」。
例子: 一個負責清除螢幕或是列印特定歡迎訊息的子程式。
函數 (Functions)
函數是一種執行任務,並且必須回傳一個值 (Return a value) 回到呼叫它的程式碼位置的子程式。它會「給予回饋」。
例子: 一個計算數字平方根並將答案提供給你的子程式。
記憶口訣: Functions Find a value! (它們會回傳 (Return) 一個值)。
常見錯誤: 忘記函數必須要有 return 語句。如果它沒有回傳任何東西,那它其實就是一個程序!
3. 參數 (Parameters) 與引數 (Arguments)
有時,子程式需要資訊才能執行任務。如果你有一個叫做 CalculateArea 的子程式,它就需要知道形狀的長度與寬度。
- 參數 (Parameters): 這些是在子程式定義中的「預留位置」。它們就像等待被填入資訊的空槽。
- 引數 (Arguments): 這些是你呼叫子程式時,真正傳入那些空槽的數值。
逐步範例:
1. 你定義了一個函數:function calculate(number1, number2)。這裡,number1 和 number2 是參數。
2. 你呼叫了這個函數:calculate(10, 5)。這裡,10 和 5 是引數。
重點總結:參數是定義中的「標籤」;引數則是程式執行期間實際使用的「真實資料」。
4. 區域變數 (Local Variables) 與全域變數 (Global Variables)
這與「範圍 (Scope)」有關,意思就是「我可以在哪裡看到這個變數?」
區域變數 (Local Variables)
區域變數是在子程式裡面宣告的。它只會在該子程式執行時存在。一旦子程式執行完畢,該變數就會被「刪除」。
比喻: 你家的鑰匙對你家來說是「區域性」的。它們在其他地方無法使用,且外面的人也不知道它們的存在。
全域變數 (Global Variables)
全域變數是在所有子程式外面宣告的,通常在腳本的最上方。程式的任何部分都可以看到並使用它。
比喻: 太陽是「全域」的。無論你在哪個「子程式」(房間)裡,每個人都看得到它。
你知道嗎? 一般來說,使用區域變數會更好。如果你使用了太多的全域變數,一個子程式可能會意外地更改了另一個子程式正在使用的數值,從而導致「邏輯錯誤」!
5. 內建子程式與自訂子程式
你不需要每次都從頭開始編寫所有子程式!
- 內建子程式 (Built-in Subprograms): 這些是程式語言(例如 Python)已經提供好的。例子包括 print()、input() 和 len()。
- 函式庫子程式 (Library Subprograms): 這些是一組可以「匯入 (import)」的預先編寫好的子程式。例如,math 函式庫讓你能夠存取 math.sqrt()。
- 自訂子程式 (User-Devised Subprograms): 這些是你為了解決特定問題而親手編寫的程式。
快速回顧箱:
- 程序: 執行任務,無回傳值。
- 函數: 執行任務,有回傳值。
- 範圍: 區域(內部)vs 全域(外部)。
- 單一入口/出口: 一個優秀的子程式應該從開頭進入,並只有一個明確的出口!
總結檢查表
在繼續往下學習之前,確認你能回答這些問題:
1. 我能解釋使用子程式的好處嗎?(分解/可重用性)
2. 我知道函數與程序有什麼不同嗎?(回傳值)
3. 我能在一小段程式碼中識別出參數嗎?
4. 我理解為什麼區域變數比全域變數「更安全」嗎?
如果起初覺得有點困難,別擔心!子程式就像積木——一旦你學會如何將它們組合在一起,你就能構建出更龐大、更酷的程式了!