你有没有想过,在写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("香蕉")) # 输出:['香蕉']
这样每次调用都会得到一个新的列表,避免了默认值的“复用”问题。
总结:默认参数的“偷懒”技巧¶
- 简化调用:给常用参数设默认值,避免重复传参;
- 注意顺序:带默认值的参数必须放在位置参数后面;
- 警惕可变对象:列表、字典等可变对象作为默认值时,用
None初始化并在函数内创建新对象。
掌握这些小技巧,你的函数会更简洁、更可靠,“偷懒”也能写出高质量代码!