← 返回大綱
函式複習

函式語法講義
& 練習題庫

從 def 基礎複習到自製「四則運算計算機」

語法講義

函式速查

def、參數、return、預設值、作用域

語法講義

函式是什麼?

把「一段常做的事」取個名字收起來

# 沒有函式:每次都要重打一次
print("=" * 20)
print("歡迎光臨")
print("=" * 20)

# 有函式:定義一次,重複使用
def welcome():
    print("=" * 20)
    print("歡迎光臨")
    print("=" * 20)

welcome()   # 呼叫函式
welcome()   # 想用幾次就用幾次
重點

def 只是「定義」,函式裡的程式碼要等到呼叫(加上 ())才會執行。

語法講義

def 語法拆解

def 函式名稱(參數1, 參數2): 函式主體(要縮排 4 個空格) return 回傳值(可省略)

實際範例

def add(a, b):       # 名稱 add,兩個參數 a、b
    result = a + b   # 主體:縮排
    return result    # 回傳計算結果

answer = add(3, 5)   # 呼叫,把回傳值存起來
print(answer)        # 8
語法講義

參數 (Parameters) 與引數 (Arguments)

定義時叫參數,呼叫時傳進去的叫引數

def greet(name, age):        # name, age 是「參數」
    print(f"{name} 今年 {age} 歲")

greet("小明", 18)             # "小明", 18 是「引數」
greet(age=18, name="小明")    # 用名字指定,順序可以顛倒
注意

不指定名字時,引數是照順序對進去的。greet(18, "小明") 會得到奇怪的結果。

語法講義

print vs return

print 是「印給人看」,return 是「交回給程式」

def add_print(a, b):
    print(a + b)         # 只印出來,沒有交回任何東西

def add_return(a, b):
    return a + b         # 把結果交回呼叫的地方

x = add_print(3, 5)      # 印出 8,但 x 是 None
y = add_return(3, 5)     # 沒有印東西,但 y 是 8
print(y * 2)             # 16 ← 因為有 return 才能繼續運算
口訣

要拿結果繼續算就用 return;只是要給使用者看才用 print

語法講義

return 的細節

return 一執行,函式就立刻結束

def check(score):
    if score >= 60:
        return "及格"
    return "不及格"      # 只有上面沒 return 才會跑到這

print(check(80))         # 及格

可以一次回傳多個值

def divide(a, b):
    return a // b, a % b     # 回傳商和餘數

q, r = divide(17, 5)         # q=3, r=2
print(f"商 {q},餘 {r}")
語法講義

預設參數值

沒傳就用預設值

def power(base, exp=2):      # exp 預設是 2
    return base ** exp

print(power(5))              # 25  → 用預設 exp=2
print(power(5, 3))           # 125 → 自己指定 exp=3
規則

有預設值的參數必須放在後面def f(a=1, b) 會直接語法錯誤。

語法講義

作用域 (Scope)

函式裡建立的變數,外面看不到

def calc():
    temp = 100        # 區域變數,只活在 calc 裡面
    print(temp)       # 100

calc()
print(temp)           # NameError:外面找不到 temp

外面的變數,函式裡讀得到

tax = 0.05                # 全域變數

def total(price):
    return price * (1 + tax)   # 讀得到 tax

print(total(100))              # 105.0
語法講義

函式互相呼叫

def add(a, b):
    return a + b

def average(a, b):
    return add(a, b) / 2      # 在函式裡呼叫另一個函式

print(average(10, 20))        # 15.0
為什麼要這樣做

每個函式只負責一件小事,再組合起來完成複雜功能。等一下的「計算機」練習就是用這個方式做出來的。

選擇題

複習選擇題

測試你對函式的理解程度!

選擇題 1 / 12

定義函式要用哪個關鍵字?

選擇題 2 / 12

下列程式碼的輸出是什麼?

def add(a, b):
    print(a + b)

x = add(3, 5)
print(x)
選擇題 3 / 12

只寫 def hello(): 但沒有呼叫,會發生什麼?

選擇題 4 / 12

下列程式碼的輸出是什麼?

def power(base, exp=2):
    return base ** exp

print(power(3))
選擇題 5 / 12

下列程式碼的輸出是什麼?

def check(n):
    if n > 0:
        return "正數"
    return "非正數"

print(check(5))
選擇題 6 / 12

哪一個函式定義是錯誤的?

選擇題 7 / 12

下列程式碼的結果是?

def show():
    msg = "hi"

show()
print(msg)
選擇題 8 / 12

下列程式碼的輸出是什麼?

def divide(a, b):
    return a // b, a % b

print(divide(17, 5))
選擇題 9 / 12

下列程式碼的輸出是什麼?

def greet(name, age):
    print(f"{name} 今年 {age} 歲")

greet(age=18, name="小明")
選擇題 10 / 12

下列程式碼的輸出是什麼?

def f(n):
    for i in range(n):
        if i == 2:
            return i
    return -1

print(f(5))
選擇題 11 / 12

下列程式碼的輸出是什麼?

def add(a, b):
    return a + b

def average(a, b):
    return add(a, b) / 2

print(average(10, 20))
選擇題 12 / 12

想把計算結果拿去繼續運算,函式裡要用?

練習題庫

動手寫函式

從單一函式開始,最後組出完整的四則運算計算機!

練習 1 — 基礎 def

打招呼函式

寫一個函式 greet(name),印出招呼語。

# 呼叫方式: greet("小明") # 預期輸出: 哈囉,小明!歡迎來學 Python
def greet(name): print(f"哈囉,{name}!歡迎來學 Python") greet("小明")
練習 2 — 基礎 def

加法函式

寫一個函式 add(a, b)回傳兩數相加的結果(不是 print)。

# 呼叫方式: print(add(3, 5)) print(add(10, 20) * 2) # 預期輸出: 8 60
def add(a, b): return a + b print(add(3, 5)) print(add(10, 20) * 2)
練習 3 — 基礎 def

搭配 input 使用

寫一個 square(n) 回傳平方值,並讓使用者輸入數字。

# 預期輸入: 請輸入一個數字:7 # 預期輸出: 7 的平方是 49
def square(n): return n * n num = int(input("請輸入一個數字:")) print(f"{num} 的平方是 {square(num)}")
練習 4 — 參數與回傳

BMI 函式化

把 BMI 計算包成函式 bmi(height, weight),回傳計算結果。

# 公式:BMI = 體重 / (身高公尺)² # 預期輸入: 身高(cm):170 體重(kg):65 # 預期輸出: 你的 BMI 是 22.5
def bmi(height, weight): return weight / (height / 100) ** 2 h = float(input("身高(cm):")) w = float(input("體重(kg):")) print(f"你的 BMI 是 {bmi(h, w):.1f}")
練習 5 — 參數與回傳

找出最大值

寫一個 bigger(a, b),回傳兩個數字中比較大的那個(不要用內建 max)。

# 呼叫方式: print(bigger(3, 9)) print(bigger(12, 7)) # 預期輸出: 9 12
def bigger(a, b): if a > b: return a return b print(bigger(3, 9)) print(bigger(12, 7))
練習 6 — 參數與回傳

成績等第函式

寫一個 grade(score),回傳 A/B/C/D/F 等第字串。

# 預期輸入: 請輸入成績:85 # 預期輸出: 成績等第:B
def grade(score): if score >= 90: return "A" elif score >= 80: return "B" elif score >= 70: return "C" elif score >= 60: return "D" return "F" s = int(input("請輸入成績:")) print(f"成績等第:{grade(s)}")
練習 7 — 參數與回傳

預設參數:打折函式

寫一個 discount(price, rate=0.9),回傳打折後的價格。沒指定折數就打 9 折。

# 呼叫方式: print(discount(1000)) print(discount(1000, 0.8)) # 預期輸出: 900.0 800.0
def discount(price, rate=0.9): return price * rate print(discount(1000)) print(discount(1000, 0.8))
練習 8 — 參數與回傳

回傳多個值

寫一個 divide(a, b),同時回傳餘數

# 呼叫方式: q, r = divide(17, 5) print(f"商 {q},餘 {r}") # 預期輸出: 商 3,餘 2
def divide(a, b): return a // b, a % b q, r = divide(17, 5) print(f"商 {q},餘 {r}")
練習 9 — 函式 + 迴圈

加總函式

寫一個 total(n),回傳 1 + 2 + ... + n 的總和。

# 預期輸入: 請輸入 N:100 # 預期輸出: 1 到 100 的總和是 5050
def total(n): s = 0 for i in range(1, n + 1): s += i return s n = int(input("請輸入 N:")) print(f"1 到 {n} 的總和是 {total(n)}")
練習 10 — 函式 + 迴圈

階乘函式

寫一個 factorial(n),回傳 n!(即 1 × 2 × ... × n)。

# 呼叫方式: print(factorial(5)) # 預期輸出: 120
def factorial(n): result = 1 for i in range(1, n + 1): result *= i return result print(factorial(5))
練習 11 — 函式 + 迴圈

質數判斷

寫一個 is_prime(n),回傳 TrueFalse

# 呼叫方式: print(is_prime(7)) print(is_prime(9)) # 預期輸出: True False
def is_prime(n): if n < 2: return False for i in range(2, n): if n % i == 0: return False return True print(is_prime(7)) print(is_prime(9))
綜合挑戰

四則運算計算機

讓使用者選運算、輸入兩個數字,算出結果

計算機 — 步驟 1

先寫四個運算函式

分別寫出 addsubmuldiv 四個函式,各自回傳結果。

# 呼叫方式: print(add(10, 3)) print(sub(10, 3)) print(mul(10, 3)) print(div(10, 3)) # 預期輸出: 13 7 30 3.3333333333333335
def add(a, b): return a + b def sub(a, b): return a - b def mul(a, b): return a * b def div(a, b): return a / b
計算機 — 步驟 2

加上選單

印出選單讓使用者選 1~4,再輸入兩個數字,用 if/elif 呼叫對應的函式。

# 預期畫面: ===== 簡易計算機 ===== 1) 加法 2) 減法 3) 乘法 4) 除法 請選擇運算(1-4):1 請輸入第一個數字:10 請輸入第二個數字:3 10 + 3 = 13.0
def add(a, b): return a + b def sub(a, b): return a - b def mul(a, b): return a * b def div(a, b): return a / b print("===== 簡易計算機 =====") print("1) 加法 2) 減法 3) 乘法 4) 除法") choice = input("請選擇運算(1-4):") x = float(input("請輸入第一個數字:")) y = float(input("請輸入第二個數字:")) if choice == "1": print(f"{x} + {y} = {add(x, y)}") elif choice == "2": print(f"{x} - {y} = {sub(x, y)}") elif choice == "3": print(f"{x} * {y} = {mul(x, y)}") elif choice == "4": print(f"{x} / {y} = {div(x, y)}") else: print("沒有這個選項!")
計算機 — 步驟 3

處理除以 0 + 包成一個函式

把「判斷選項並計算」包成 calculate(choice, a, b),並在除法時檢查 b 是不是 0。

# 呼叫方式: print(calculate("4", 10, 0)) # 預期輸出: 不能除以 0!
def add(a, b): return a + b def sub(a, b): return a - b def mul(a, b): return a * b def div(a, b): if b == 0: return "不能除以 0!" return a / b def calculate(choice, a, b): if choice == "1": return add(a, b) elif choice == "2": return sub(a, b) elif choice == "3": return mul(a, b) elif choice == "4": return div(a, b) return "沒有這個選項!" print(calculate("4", 10, 0))
計算機 — 步驟 4

完整版:可以一直算下去

while 讓計算機重複執行,輸入 0 才離開,並統計總共算了幾次。

# 預期畫面: ===== 簡易計算機 ===== 1) 加法 2) 減法 3) 乘法 4) 除法 0) 離開 請選擇:1 第一個數字:10 第二個數字:3 結果:13.0 請選擇:0 總共計算了 1 次,掰掰!
def add(a, b): return a + b def sub(a, b): return a - b def mul(a, b): return a * b def div(a, b): if b == 0: return "不能除以 0!" return a / b def calculate(choice, a, b): if choice == "1": return add(a, b) elif choice == "2": return sub(a, b) elif choice == "3": return mul(a, b) elif choice == "4": return div(a, b) return "沒有這個選項!" def menu(): print("===== 簡易計算機 =====") print("1) 加法 2) 減法 3) 乘法 4) 除法 0) 離開") count = 0 while True: menu() choice = input("請選擇:") if choice == "0": print(f"總共計算了 {count} 次,掰掰!") break if choice not in ["1", "2", "3", "4"]: print("沒有這個選項,請重選!") continue a = float(input("第一個數字:")) b = float(input("第二個數字:")) print(f"結果:{calculate(choice, a, b)}") count += 1
延伸挑戰

再進化一點

挑戰 A:加上更多運算

# 5) 次方 a ** b
# 6) 取餘數 a % b
# 7) 整數除法 a // b

挑戰 B:記住歷史紀錄

# 用 list 存下每次的算式字串
# 離開前把所有算式印出來

挑戰 C:連續加總模式

# 讓使用者一直輸入數字,輸入 end 才停
# 寫一個 sum_all(numbers) 回傳全部的總和

函式複習完成!

函式是把程式拆小、重複利用的關鍵,計算機練習建議在 Playground 實際跑一次!

選擇題:0 對 / 0