函式:把步驟包起來
把常用的步驟包成函式,取個好名字,之後一行就能呼叫。程式變短、變好讀,也比較不容易出錯。
你已經在用函式了
其實你從第一支程式就在用函式: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 是倒出來的那杯果汁。
參數進去、結果出來。呼叫的人不用知道裡面怎麼做。
實際應用:問金額的函式
還記得上一堂用 .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只負責「拿到一個合法的金額」,不負責加總,也不負責印報表。 - 名字用動詞開頭,說清楚它做什麼。
ask_amount、calc_total、save_record,看名字就猜得到用途。
這兩個習慣,在你讀 AI 寫的程式時特別有用。AI 常常一次產生好幾十行程式,如果它有好好切成函式,你可以一個一個讀、一個一個測。如果它全部擠在一起,你可以直接請它重構。
下面是我寫的 Python 程式,請幫我找出重複的部分,建議可以抽成哪些函式。請先只告訴我函式的名稱、參數和用途,不要直接給完整程式碼,我想自己試著寫寫看。
(貼上你的程式)
請 AI「先給方向、不給答案」,是用 AI 學習時很好用的技巧。
- 寫一個函式
calc_total(a, b, c),回傳三個數字的總和。 - 寫一個函式
comment(total),依照總和回傳(不是印出)一句評語,門檻用上一堂你訂的。 - 結合
ask_amount,把你的daily.py改寫成:問三餐、算總和、印出評語。
寫完之後檢查:主程式的部分是不是只剩幾行,而且讀起來像一段中文說明?
讀完了嗎?
標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。
留言與討論
卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。