Python 函式與模組

進階

def 定義函式,參數是輸入,return 把結果交回;import 引入模組(math 平方根、random 隨機數);函式寫一次隨處用,令程式短而清晰。

適合:中二資訊及通訊科技 · 單元:演算法與程式 · 建議學習路徑第 6/12 課

學完呢課,你會識:
  • def 定義函式;呼叫函式名加括號才會執行。
  • 參數是函式的輸入;return 把結果交回。
  • print 只顯示;return 才可以拿來繼續計算。
文體:編程教學課有聲朗讀

文體小知識:編程教學課每個概念都配一段可以親手試的代碼例子,照住輸入、改一改,最快學會。

資訊及通訊科技Information & Communication Technology

§課文原文 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

F
Function函式

有名字、可重複使用的程式碼區塊,接收輸入、可以回傳結果。

d
def定義關鍵字

Python 用來定義函式的關鍵字,格式:def 函式名(參數):。

P
Parameter參數

定義函式時括號內的變數,是函式的輸入,例如 def greet(name) 的 name。

A
Argument引數

呼叫函式時括號內的實際值,例如 greet("小明") 的「小明」。

R
Return value回傳值

函式用 return 交回給呼叫者的結果,可以繼續拿去計算。

C
Call呼叫

執行函式:寫函式名加括號並給出引數,例如 greet("小明")。

M
Module模組

預先寫好的函式庫,例如 math、random,引入後即可使用。

i
import引入

把模組載入程式的關鍵字,例如 import math 之後才能用 math.sqrt。

r
random.randint()隨機整數函數

回傳指定範圍內(包括兩端)的隨機整數,例如 random.randint(1, 6) 模擬擲骰。

3逐步講解 Steps

  1. 定義與呼叫第一個函式函式(Function)是一段有名字、可重複使用的程式碼。用 def 定義:def hello(): 下一行縮排 print("Hello!")。定義之後程式並不會立即執行函式體,必須呼叫 hello() 才會印出 Hello!。語法要點:def 關鍵字、函式名、括號、冒號,函式體必須縮排。把常用的計算或顯示寫成函式,之後任何地方輸入函式名即可使用,達到「寫一次、處處可用」的效果。
  2. 參數:函式的輸入括號內的名字是參數(Parameter),即函式的輸入。def greet(name): print("你好," + name) 定義了一個帶參數的函式;呼叫 greet("小明") 印出「你好,小明」,greet("Mary") 印出「你好,Mary」。同一個函式,不同輸入產生不同結果,如同自動販賣機:同一部機器,投入不同選擇出不同飲品。參數可以有多個,例如 def area(w, h),呼叫時按次序傳入 area(3, 4),第一個參數對應 3,第二個對應 4。
  3. 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 是函式向外交付成果的正式通道,令函式像零件一樣串聯組合,構成更大的程式。
  4. 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。
  5. 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 模組同樣是標準工具。
  6. 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 模組之上。
  7. 函式加迴圈:威力倍增函式與呼叫組合威力倍增。定義 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

Python 函式:一塊可重用嘅積木 Functionsdef make_tea(cups):return "沖好 " + str(cups) + " 杯茶"print(make_tea(3))↑ def 定義 cups 係參數 return 交返結果寫一次 make_tea(),之後無論要 3 杯定 100 杯,一句 call 搞掂好處:唔使重複寫同一段碼;改一處,全部生效——模組化思維模組 module:人哋寫好嘅函式庫(例如 random 隨機數),import 就用得
圖 1:Python 函式結構

5例題示範 Example

例題:寫一個函式 max2(a, b) 回傳兩數中較大的一個,並用它找出 17 和 9 的較大者。

  1. def max2(a, b): — 定義函式,兩個參數 a 和 b。
  2. 函式體:if a > b: return a,否則 return b。
  3. 呼叫:print(max2(17, 9)) — 因為 17 > 9 成立,回傳 a = 17。
  4. 再試邊界:print(max2(9, 9)) — a > b 不成立,走 return b = 9;兩數相等時結果仍是 9,正確。
  5. 答案:def max2(a, b): if a > b: return a,否則 return b;max2(17, 9) = 17。

6常見錯誤 Mistakes

✗ 「def 寫完,函式就會自動執行。」
✓ def 只是定義;要呼叫(例如 hello())才會執行。
✗ 「函式體不用縮排。」
✓ Python 靠縮排分辨哪些語句屬於函式或迴圈;漏了縮排會語法錯誤。
✗ 「print 和 return 一樣。」
✓ print 只負責顯示;return 把值交回程式繼續運算。要拿結果繼續運算必須用 return。
✗ 「greet(name) 和 greet("小明") 是同一回事。」
✓ 定義時括號內是參數(name),呼叫時括號內是實際值("小明");呼叫時必須給實際值。
✗ 「用 math.sqrt 之前不用 import。」
✓ 模組要先 import(例如 import math),否則會出現 NameError。

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 隨機整數。
  • 函式寫一次隨處用 — 更短、易改、易測。

同級其他科

同一科其他級別