Default Function Parameters in Python: A "Lazy" Usage Function Parameter Defaults: Python's "Lazy" Approach for Function Arguments

你有没有想过,在写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 初始化并在函数内创建新对象。

掌握这些小技巧,你的函数会更简洁、更可靠,“偷懒”也能写出高质量代码!

Xiaoye