Python 函式與模組
進階def 定義函式,參數是輸入,return 把結果交回;import 引入模組(math 平方根、random 隨機數);函式寫一次隨處用,令程式短而清晰。
- def 定義函式;呼叫函式名加括號才會執行。
- 參數是函式的輸入;return 把結果交回。
- print 只顯示;return 才可以拿來繼續計算。
文體小知識:編程教學課每個概念都配一段可以親手試的代碼例子,照住輸入、改一改,最快學會。
§課文原文 Passage
1函式(Function)是一段有名字、可以重複使用的程式碼。用 def 定義:def greet(name): print("你好," + name)。之後任何地方輸入 greet("小明") 就會印出「你好,小明」— 寫一次,用到足。定義了但未呼叫,函式是不會執行的。
2括號內的 name 是參數(Parameter),是函式的「輸入」;函式可以用 return 把結果交回給呼叫者:def area(w, h): return w * h。執行 result = area(3, 4) 之後,result 就是 12。return 的結果可以繼續拿去計算(例如 area(3, 4) * 2 得 24),這是 print 做不到的。
3模組(Module)是別人寫好的函式庫:import math 之後可以用 math.sqrt(16) 計平方根(得 4.0)、math.pi 是圓周率;import random 之後 random.randint(1, 6) 可以模擬擲骰(1 至 6 隨機整數)。站在別人的肩膀上,不用樣樣自己寫。
4為什麼要用函式?試想想一份程式要計 20 位同學各自三科的平均分:把計算寫成函式 average(scores),之後每人一行就能計好;不用把同一段代碼貼上 20 次。函式令程式更短、更易改、更易測試 — 改函式一行,所有用到的地方同時更新。
1重點摘要 Summary
def 定義函式,參數是輸入,return 把結果交回;import 引入模組(math 平方根、random 隨機數);函式寫一次隨處用,令程式短而清晰。
2生字卡 Vocabulary
有名字、可重複使用的程式碼區塊,接收輸入、可以回傳結果。
Python 用來定義函式的關鍵字,格式:def 函式名(參數):。
定義函式時括號內的變數,是函式的輸入,例如 def greet(name) 的 name。
呼叫函式時括號內的實際值,例如 greet("小明") 的「小明」。
函式用 return 交回給呼叫者的結果,可以繼續拿去計算。
執行函式:寫函式名加括號並給出引數,例如 greet("小明")。
預先寫好的函式庫,例如 math、random,引入後即可使用。
把模組載入程式的關鍵字,例如 import math 之後才能用 math.sqrt。
回傳指定範圍內(包括兩端)的隨機整數,例如 random.randint(1, 6) 模擬擲骰。
3逐步講解 Steps
- 定義與呼叫第一個函式函式(Function)是一段有名字、可重複使用的程式碼。用 def 定義:def hello(): 下一行縮排 print("Hello!")。定義之後程式並不會立即執行函式體,必須呼叫 hello() 才會印出 Hello!。語法要點:def 關鍵字、函式名、括號、冒號,函式體必須縮排。把常用的計算或顯示寫成函式,之後任何地方輸入函式名即可使用,達到「寫一次、處處可用」的效果。
- 參數:函式的輸入括號內的名字是參數(Parameter),即函式的輸入。def greet(name): print("你好," + name) 定義了一個帶參數的函式;呼叫 greet("小明") 印出「你好,小明」,greet("Mary") 印出「你好,Mary」。同一個函式,不同輸入產生不同結果,如同自動販賣機:同一部機器,投入不同選擇出不同飲品。參數可以有多個,例如 def area(w, h),呼叫時按次序傳入 area(3, 4),第一個參數對應 3,第二個對應 4。
- return:交回結果return 語句把結果交回給呼叫者:def area(w, h): return w * h 定義之後,x = area(3, 4) 令 x = 12。交回的值可以繼續參與計算:area(3, 4) * 2 得 24,area(3, 4) + area(2, 5) 得 22。注意 return 之後的函式體不會執行,因為函式已經結束。return 是函式向外交付成果的正式通道,令函式像零件一樣串聯組合,構成更大的程式。
- return 與 print 的分別return 與 print 常被混淆。print 只是顯示在螢幕上,值並沒有交回程式;return 才是把值交回。對比:def f(): return 5 之後可以寫 y = f() + 1,y 是 6,因為 f() 交回了 5;若 def g(): print(5),執行 y = g() + 1 時 y 拿不到任何值,運算報錯,因為 g 只負責顯示、沒有交回任何東西。口訣:print 給人看,return 給程式用;需要結果參與計算時,必須用 return。
- math 模組:現成的數學工具模組(Module)是別人寫好的函式庫,import 之後即可使用。import math 之後:math.sqrt(16) 計算平方根得 4.0;math.pi 是圓周率 ≈ 3.14159;計算半徑 3 的圓面積:math.pi * 3 * 3 ≈ 28.27。不必自己發明平方根的計算方法,站在別人的肩膀上做事,這正是模組的價值。常用的還有 math.ceil 與 math.floor 等取整函式;往後學習三角計算時,math 模組同樣是標準工具。
- random 模組:模擬隨機import random 之後可以模擬隨機事件。random.randint(1, 6) 模擬擲骰子,每次隨機傳回 1 至 6 的整數;配合 for 迴圈可以擲十次:for i in range(10): print(random.randint(1, 6))。random.choice(["蘋果", "香蕉", "橙"]) 從清單隨機抽一項,可用來做課堂抽籤小程式;random.shuffle 則把清單次序打亂,如同洗牌。抽獎程式、遊戲中敵人隨機走動、統計模擬,全部建立在 random 模組之上。
- 函式加迴圈:威力倍增函式與呼叫組合威力倍增。定義 def average(nums): return sum(nums) / len(nums) 之後:print(average([80, 90])) 得 85.0;print(average([70, 75, 95])) 得 80.0;多少次呼叫都可以,不必重寫計算。實際場景:全班 30 人各三科成績,每人一行 average(該人成績) 即可完成統計;若計算方法要修改,例如剔除最低分再計,只需改函式內一行,所有呼叫同時更新,這正是函式化編程的核心優勢。
4圖解 Diagrams
5例題示範 Example
例題:寫一個函式 max2(a, b) 回傳兩數中較大的一個,並用它找出 17 和 9 的較大者。
- def max2(a, b): — 定義函式,兩個參數 a 和 b。
- 函式體:if a > b: return a,否則 return b。
- 呼叫:print(max2(17, 9)) — 因為 17 > 9 成立,回傳 a = 17。
- 再試邊界:print(max2(9, 9)) — a > b 不成立,走 return b = 9;兩數相等時結果仍是 9,正確。
- 答案:def max2(a, b): if a > b: return a,否則 return b;max2(17, 9) = 17。
6常見錯誤 Mistakes
75 題快測 Quick check
Q1哪個關鍵字用來定義函式?A. function B. def C. define
Q2def add(a, b): return a + b,那麼 add(3, 5) 的結果是多少?
Q3函式中要把計算結果交回給呼叫者,應該用什麼?
Q4import random 之後,怎樣模擬擲一次六面骰?
Q5為什麼要把常用計算寫成函式?
8重點回顧 Recap
- def 定義函式;呼叫函式名加括號才會執行。
- 參數是函式的輸入;return 把結果交回。
- print 只顯示;return 才可以拿來繼續計算。
- import 模組:math.sqrt 平方根、math.pi 圓周率、random.randint 隨機整數。
- 函式寫一次隨處用 — 更短、易改、易測。