所有入門單元免費開放 · 課程內容持續更新中

函式:把步驟包起來

把常用的步驟包成函式,取個好名字,之後一行就能呼叫。程式變短、變好讀,也比較不容易出錯。

第 1.5 堂約 14 分鐘

你已經在用函式了

其實你從第一支程式就在用函式:print()、input()、int() 都是。它們是 Python 內建、別人先寫好的「一包步驟」,你只要叫名字、放進材料,它就會做事。

這堂課要學的是:自己做一個函式。

為什麼需要?想像你的記帳程式裡,有三個地方都要「問一個金額,檢查是不是數字,再轉成整數」。如果每次都把那幾行複製貼上,一旦要修改(例如提示文字想改),就得改三個地方,很容易漏掉一個。

把它包成函式,就只需要改一個地方。

定義和呼叫

def greet(name):
    print(f"嗨,{name},今天也辛苦了!")

greet("小美")
greet("阿明")
嗨,小美,今天也辛苦了!
嗨,阿明,今天也辛苦了!

拆開來看:

  • def 是「定義」的意思,告訴 Python:我要做一個新的函式。
  • greet 是函式的名字。
  • 括號裡的 name 是參數,也就是呼叫時要交進來的材料。
  • 冒號和縮排,跟上一堂的 if、for 一樣,代表「這幾行屬於這個函式」。

定義好之後,它不會自己執行。要等你寫 greet("小美") 呼叫它,裡面的步驟才會跑。

return:把結果交回來

很多時候我們不只想印東西,而是要函式算出一個值,交給程式繼續用。這時用 return:

def add_tax(price):
    return round(price * 1.05)

lunch = add_tax(100)
dinner = add_tax(200)
print(f"含稅總共 {lunch + dinner} 元")
含稅總共 315 元

把函式想成一台果汁機:參數是你丟進去的水果,函式裡的程式是攪打的過程,return 是倒出來的那杯果汁。

示意圖:參數 price 等於 100 從左邊放入函式 add_tax,函式裡乘上 1.05,return 從右邊交回 105

參數進去、結果出來。呼叫的人不用知道裡面怎麼做。

實際應用:問金額的函式

還記得上一堂用 .isdigit() 檢查輸入嗎?我們把它包起來,再加一個 while,讓它問到使用者輸入正確為止:

def ask_amount(question):
    while True:
        text = input(question)
        if text.isdigit():
            return int(text)
        print("請輸入阿拉伯數字,例如 85")

breakfast = ask_amount("早餐花多少?")
lunch = ask_amount("午餐花多少?")
dinner = ask_amount("晚餐花多少?")
print(f"今天三餐一共 {breakfast + lunch + dinner} 元")

while True 表示「一直重複」,那它怎麼停?答案是 return:函式一遇到 return 就會立刻結束,把值交回去,迴圈也跟著結束了。

看看呼叫的那三行,是不是一眼就看懂在做什麼?這就是函式最大的價值:把「怎麼做」藏起來,只留下「做什麼」。

比較圖:左邊沒有函式時三段重複的檢查程式,右邊用 ask_amount 函式後只剩三行清楚的呼叫

好函式的兩個習慣

  1. 一個函式只做一件事。 ask_amount 只負責「拿到一個合法的金額」,不負責加總,也不負責印報表。
  2. 名字用動詞開頭,說清楚它做什麼。 ask_amount、calc_total、save_record,看名字就猜得到用途。

這兩個習慣,在你讀 AI 寫的程式時特別有用。AI 常常一次產生好幾十行程式,如果它有好好切成函式,你可以一個一個讀、一個一個測。如果它全部擠在一起,你可以直接請它重構。

可以這樣問 Claude

下面是我寫的 Python 程式,請幫我找出重複的部分,建議可以抽成哪些函式。請先只告訴我函式的名稱、參數和用途,不要直接給完整程式碼,我想自己試著寫寫看。

(貼上你的程式)

請 AI「先給方向、不給答案」,是用 AI 學習時很好用的技巧。

行動練習
  1. 寫一個函式 calc_total(a, b, c),回傳三個數字的總和。
  2. 寫一個函式 comment(total),依照總和回傳(不是印出)一句評語,門檻用上一堂你訂的。
  3. 結合 ask_amount,把你的 daily.py 改寫成:問三餐、算總和、印出評語。

寫完之後檢查:主程式的部分是不是只剩幾行,而且讀起來像一段中文說明?

讀完了嗎?

標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。

卡住了?讓 AI 當你的家教複製這段提問範本,貼到 Claude 或其他 AI 工具,再補上你卡住的地方。

留言與討論

卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。

留言區即將開放。現在可以先到 GitHub 討論區 發問,或看看 交流頁 的其他管道。