函數參數默認值:Python函數參數的“偷懶”用法

你有沒有想過,在寫Python函數時,如果某些參數經常用同一個值,能不能不用每次都重複輸入?比如,寫一個計算年齡的函數,默認年齡是18歲,除非用戶特別指定,否則就用18。這時候,函數參數的默認值就能幫上忙了。

什麼是函數參數默認值?

函數參數的默認值,就是在定義函數的時候,給某個參數設定一個“備用值”。當調用這個函數時,如果這個參數沒有被顯式傳入,Python就會自動使用這個默認值。這樣做的好處是,讓函數調用更簡單,減少重複代碼,簡直是“偷懶”的好幫手!

基礎用法:給參數加個“備胎”

最簡單的例子,比如寫一個打招呼的函數,默認對“陌生人”打招呼:

def greet(name="陌生人"):
    print(f"你好,{name}!")

# 調用時不傳入name,使用默認值
greet()  # 輸出:你好,陌生人!

# 調用時傳入name,覆蓋默認值
greet("小明")  # 輸出:你好,小明!

這裏 name="陌生人" 就是參數的默認值,當調用 greet() 時,Python會自動用 name="陌生人";如果傳入 name="小明",就用“小明”覆蓋默認值。

多個默認參數:注意參數順序!

如果函數有多個帶默認值的參數,必須把帶默認值的參數放在位置參數後面,否則會報錯。比如:

# 正確示例:默認參數在後
def calc_area(length=5, width=3):
    return length * width

print(calc_area())       # 輸出:15(5*3)
print(calc_area(4))      # 輸出:12(4*3)
print(calc_area(4, 6))   # 輸出:24(4*6)

# 錯誤示例:默認參數在前
def calc_area(length=5, width):  # 語法錯誤!
    return length * width

原因是Python要求先定義不帶默認值的位置參數,再定義帶默認值的參數,否則無法確定參數對應關係。

常見陷阱:默認值的“複用”問題

這裏有個容易踩坑的地方:如果默認值是可變對象(比如列表、字典),每次調用函數時,它會“記住”上一次調用的結果,導致意外行爲。

錯誤示例(列表默認值):

def add_item(item, list_items=[]):
    list_items.append(item)
    return list_items

# 第一次調用
print(add_item("蘋果"))  # 輸出:['蘋果']
# 第二次調用(未傳新列表)
print(add_item("香蕉"))  # 輸出:['蘋果', '香蕉']

你可能預期第二次調用只添加“香蕉”,但結果卻是 ['蘋果', '香蕉']。這是因爲默認值 [] 是在函數定義時創建的同一個列表對象,每次調用都會複用它!

正確解決方法:用 None 初始化

要避免這個問題,應該把默認值設爲 None,然後在函數內部創建新的可變對象。比如:

def add_item(item, list_items=None):
    if list_items is None:  # 如果沒傳新列表,就創建一個空列表
        list_items = []
    list_items.append(item)
    return list_items

# 第一次調用
print(add_item("蘋果"))  # 輸出:['蘋果']
# 第二次調用(未傳新列表,自動創建空列表)
print(add_item("香蕉"))  # 輸出:['香蕉']

這樣每次調用都會得到一個新的列表,避免了默認值的“複用”問題。

總結:默認參數的“偷懶”技巧

  1. 簡化調用:給常用參數設默認值,避免重複傳參;
  2. 注意順序:帶默認值的參數必須放在位置參數後面;
  3. 警惕可變對象:列表、字典等可變對象作爲默認值時,用 None 初始化並在函數內創建新對象。

掌握這些小技巧,你的函數會更簡潔、更可靠,“偷懶”也能寫出高質量代碼!

小夜