會「寫函數」只是起點;會「設計好用的函數介面」才是關鍵。這一篇把兩條主線一次講清楚:
- 內建函數能立即解決 80% 的日常需求(
print()
,len()
,str()
…),懂得查文件就能少寫很多輪子; - 自訂函數要寫得好,重點在參數設計與回傳策略:何時用位置引數、何時用關鍵字引數、怎麼安排預設值,還有如何一次回傳多個結果,讓你的函數既好讀又不容易被呼叫錯。
讀完後,你能把函數當成「小型 API」來思考——命名清楚、輸入明確、輸出可用,呼叫起來不容易搞錯。
內建函數與用戶自定義函數
內建函數 (Built-in Functions)
Python 自帶的函數,可直接使用
print()
– 輸出內容len()
– 獲取長度str()
– 轉換為字符串int()
– 轉換為整數help()
– 獲取幫助
參考: Python 官方文檔
用戶自定義函數 (User Defined Functions)
由程序員創建的函數
def calculate_distance(origin, destination):
# 自定義計算距離的代碼
return distance
多個參數 (Multiple Parameters)
定義多參數函數
def trip_welcome(origin, destination):
print("歡迎使用旅行規劃應用")
print("看起來您從" + origin + "出發")
print("前往" + destination)
多個參數用逗號分隔
呼叫多參數函數
trip_welcome("展望公園", "大西洋航站站")
注意:參數的順序非常重要!第一個引數對應第一個參數,依此類推。
引數類型 (Types of Arguments)
位置引數 (Positional Arguments)
根據在函數呼叫中的位置匹配參數
calculate_taxi_price(100, 10, 5)
關鍵字引數 (Keyword Arguments)
明確指定引數對應的參數名稱
calculate_taxi_price(
rate=0.5,
discount=10,
miles_to_travel=100)
默認引數 (Default Arguments)
參數設有默認值,可選擇性覆蓋
def calculate_taxi_price(
miles_to_travel,
rate,
discount = 10):
# 函數體
位置引數 (Positional Arguments)
當呼叫函數時,位置引數會根據它們在引數列表中的順序,與函數定義中的參數進行匹配。
這意味著引數的數量和順序必須與參數的定義完全一致。第一個引數匹配第一個參數,第二個引數匹配第二個參數,依此類推。
- 引數的數量必須與參數的數量相符。
- 引數的順序至關重要,不能錯亂。
- 這是最直接和預設的引數傳遞方式。
def calculate_travel_cost(distance, fuel_price, passengers):
# 計算旅行總燃料費用及每位乘客分攤費用。
# 假設每10公里消耗1單位燃料
total_fuel_cost = (distance / 10) * fuel_price
cost_per_passenger = total_fuel_cost / passengers
print("總燃料費用: $" + str(total_fuel_cost))
print("每位乘客費用: $" + str(cost_per_passenger))
# 呼叫時,引數按順序對應:
# distance=200, fuel_price=30, passengers=4
calculate_travel_cost(200, 30, 4)
關鍵字引數 (Keyword Arguments)
當呼叫函數時,關鍵字引數允許您明確指定哪個引數值應對應哪個參數名稱。
這提供了更高的靈活性和程式碼可讀性,特別是當函數有多個參數,或參數順序不直觀時。
def calculate_taxi_price(miles_to_travel, rate, discount):
# 計算計程車費用。
base_price = miles_to_travel * rate
final_price = base_price - discount
print("計程車總費用: $" + str(final_price))
# 使用關鍵字引數呼叫函數,順序可以不同
calculate_taxi_price(
rate=0.5,
discount=10,
miles_to_travel=100)
# 輸出: 計程車總費用: $40.00
默認引數 (Default Arguments)
默認引數允許我們在定義函數時,為某些參數設定一個預設值。
這意味著在呼叫函數時:
- 如果該參數沒有被提供引數,它將使用預設值。
- 如果提供了引數,則預設值會被新的引數覆蓋。
優點:
- 增加彈性:函數能以更多方式被呼叫,對於常見情況可以簡化呼叫。
- 提高可讀性:程式碼更清晰,一眼就能看出參數的預期行為。
def calculate_shipping(item_price, quantity=1, discount=0.05):
# 計算運費,包含商品價格、數量及折扣。
total_price = item_price * quantity
final_price = total_price * (1 - discount)
print("最終價格: $" + str(round(final_price, 2)))
# 呼叫函數,使用 quantity 和 discount 的默認值
calculate_shipping(100) # 輸出: 最終價格: $95.00 (100 * 1 * 0.95)
# 呼叫函數,覆蓋 quantity 的默認值
calculate_shipping(100, quantity=2) # 輸出: 最終價格: $190.00 (100 * 2 * 0.95)
# 呼叫函數,覆蓋所有默認值
calculate_shipping(100, quantity=2, discount=0.1) # 輸出: 最終價格: $180.00 (100 * 2 * 0.9)
多返回值 (Multiple Returns)
函數可以通過用逗號分隔來返回多個值:
def threeday_weather_report(weather):
first_day = "明天天氣將會是" + weather[0]
second_day = "後天天氣將會是" + weather[1]
third_day = "大後天天氣將會是" + weather[2]
return first_day, second_day, third_day
weather_data = ['晴天', '晴天', '多雲']
monday, tuesday, wednesday = threeday_weather_report(weather_data)
print(monday) # 明天天氣將會是晴天
調用函數時,我們可以分配多個變量來接收這些返回值。
總結
- 內建函數先用起來:
print()
顯示、len()
計數、str()/int()
轉型、help()
看說明;能解決就別重造輪子。 - 自訂函數三件事:清楚的名稱、必要的參數、有用的回傳值(需要後續運算就
return
,不是print
)。 - 參數傳遞心法
- 位置引數:依序對位,簡潔但易錯;適合常用、直覺的參數。
- 關鍵字引數:指名道姓、可調順序,提升可讀性;適合多參數或順序不直覺時。
- 預設引數:提供常見值,讓呼叫更省事;把有預設值的參數放在最後。
- 避免地雷:呼叫時不可在關鍵字引數後面再放位置引數;預設值不要用可變物件(如
[]
、{}
),以免共用狀態造成隱形 bug。
- 多回傳值:以逗號分隔回傳(實為回傳一個 tuple),呼叫端可一次解包多個變數,讓流程更乾淨。