隨著程式越來越大、功能越來越多,你很快就會發現一個工程師的終極噩夢:「程式碼變得又臭又長,而且裡面充滿了大量複製貼上的重複片段。」
身為一個優雅的 Python 程式設計師,我們絕對不能容忍這種事情發生。
今天要來學習如何把一整組常重複使用的程式碼打包成一個漂亮的「自訂函式(Function)」。
這就像是為你自己量身打造一個自動化工具箱!
在 Python 裡,創造一個函式的指令叫做 def(Define 的縮寫)。
很多新手一看到函式的公式:def function_name(argument): 就覺得頭大。請別慌,請在腦海中想像一台「自動果汁機」:
我們直接來看程式碼怎麼寫:
#1. 定義一台果汁機
def make_juice(fruit, liquid):
print(f"正在將 {fruit} 和 {liquid} 放入果汁機...")
result = f"一杯好喝的 {fruit}{liquid}"
return result # 關鍵字!吐出成品
定義好這台機器後,它不會自己啟動(就像果汁機插著電放在廚房,你不按開關它不會動)。我們要寫一行程式碼去「呼叫(Call)」它:
#2. 按下開關,呼叫函式
我的飲料 = make_juice("芒果", "綠茶")
print(我的飲料)
#執行後,終端機會優雅地印出:
#正在將 芒果 和 綠茶 放入果汁機...
#一杯好喝的 芒果綠茶
這絕對是全天下程式新手在學函式時,100% 都會跌倒一次的深坑:「既然前面都有 print 了,為什麼最後還要寫一個 return?它們不是都能把字秀出來嗎?」
完全不一樣! 請一定要把下面這段譬喻刻進大腦裡:
• print() 是「螢幕投射(大聲公)」:它單純只是把一個東西「秀在螢幕上給人類看」。電腦執行完 print 後,轉頭就把這個資料忘得一乾二淨。
• return 是「遞交成品(實體交付)」:它是函式執行完後,把真正做好的「實體成品」親手交還給主程式。主程式拿到這個成品後,可以把它存進變數裡,留著等一下繼續用。
🎭 舉個現實生活的血淋淋例子:
想像你今天去麥當勞點餐(呼叫點餐函式):
• 如果店員只有 print:他會對著你大喊:「好的,這是一位大麥克套餐!」(螢幕有顯示),然後……就沒有然後了,他沒有把餐點拿給你,他就轉身去忙了。你只能看著螢幕發呆,肚子還是扁的。
• 如果店員有 return:他不會廢話,直接把一袋熱騰騰的「大麥克套餐(實體成品)」交到你手上(Return 拿到資料)。
你拿到這袋餐點後,可以決定要現在吃、還是放進包包(存入變數)等一下吃。
這就是為什麼我們需要 return!當我們需要函式幫我們計算一個數字、或是處理一段文字,並把結果留給後面的程式碼繼續用時,就一定要用 return。
🛠️ 實戰練習:改造我們熟悉的工具
還記得我們常常需要把「字串轉成整數」或者是計算數值嗎?
我們來寫一個非常實用的函式,叫做「計算含稅價格」:
def calculate_tax(price):
total = price * 1.05 # 假設營業稅是 5%
return int(total) # 把小數點去掉,只回傳整數部分
#呼叫看看
apple_phone = 30000
final_cost = calculate_tax(apple_phone)
print(f"這台手機的含稅價格是:{final_cost} 元。")
有了這個函式,以後不管你要算手機、筆電還是珍奶的含稅價,你都不用再重複寫一次 * 1.05,只需要優雅地呼叫 calculate_tax() 就可以了。程式碼是不是瞬間變得非常乾淨、非常好維護呢?
今天我們成功解鎖了「自訂函式」的心法,弄懂了果汁機理論、參數以及最重要的 return 觀念。這代表你已經具備了「模組化」的思維,不再是一條龍寫到底的新手了。
下次我們要延續函式的觀念,聊聊一個非常有趣但也充滿陷阱的話題——全域變數與區域變數的「平行宇宙」。為什麼有時候你在函式裡改變了便利貼,外面的世界卻完全沒反應?
🧑💻 今日小作業
動手寫寫看:定義一個叫 say_hello(name) 的函式:
• 參數是 name(一個人的名字)。
• 函式內部會 return 一個字串,例如:"哈囉,[名字],祝你有美好的一天!"
• 呼叫這個函式,並用 print 把回傳的結果印出來。