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),呼叫端可一次解包多個變數,讓流程更乾淨。

發佈留言

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

High Quality

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Fast Delivery

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Best Warranty

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.