Python 函數 (11):內建 vs 自訂、參數傳遞全攻略——位置/關鍵字/預設值與多回傳

會「寫函數」只是起點;會「設計好用的函數介面」才是關鍵。這一篇把兩條主線一次講清楚:

  1. 內建函數能立即解決 80% 的日常需求(print(), len(), str()…),懂得查文件就能少寫很多輪子;
  2. 自訂函數要寫得好,重點在參數設計回傳策略:何時用位置引數、何時用關鍵字引數、怎麼安排預設值,還有如何一次回傳多個結果,讓你的函數既好讀又不容易被呼叫錯。

讀完後,你能把函數當成「小型 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),呼叫端可一次解包多個變數,讓流程更乾淨。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端