一、什么是默认参数
定义函数时,可以给形参指定默认值,调用函数时如果不传这个参数,会自动使用预设的默认值;如果手动传入实参,则覆盖默认值。
基础语法
def 函数名(参数1=默认值, 参数2=默认值):
函数体
简单示例
# 定义默认参数 age=18
defshow_info(name, age=18):
print(f"姓名:{name},年龄:{age}")
# 只传必填参数name,age使用默认18
show_info("小明")
# 传入age,覆盖默认值
show_info("小红", 22)
输出:
姓名:小明,年龄:18
姓名:小红,年龄:22
二、使用规则(必记)
规则1:带默认值的参数必须放在无默认参数后面
错误写法:
# 报错:非默认参数不能跟在默认参数后面
defshow_info(age=18, name):
pass
正确写法:无默认在前,默认参数在后
defshow_info(name, age=18, gender="男"):
pass
规则2:默认参数只会在函数定义时只创建一次(核心坑点)
这是Python默认参数最容易踩的bug: 默认参数的赋值仅在函数加载时执行1次,后续多次调用复用同一个对象。
1. 不可变类型(数字、字符串、元组)无副作用
deffunc(a=10):
a += 1
print(a)
func() # 11
func() # 11 每次修改的是局部变量a,不影响默认值本身
2. 可变类型(列表、字典、集合)大坑!
# 默认参数是可变列表
defadd_item(num, lst=[]):
lst.append(num)
print(lst)
add_item(1)
add_item(2)
add_item(3)
预期输出:
[1]
[2]
[3]
实际输出:
[1]
[1, 2]
[1, 2, 3]
原因:lst=[] 只创建一次,所有调用共享同一个列表对象。
规则3:可变类型默认参数标准解决方案
不要直接用可变对象当默认值,默认设为 None,函数内部再初始化:
defadd_item(num, lst=None):
if lst isNone:
lst = [] # 每次调用新建空列表
lst.append(num)
print(lst)
add_item(1) # [1]
add_item(2) # [2]
add_item(3) # [3]
三、关键字传参搭配默认参数
多个默认参数时,可以选择性覆盖某一个参数,不用按顺序传值:
defuser(name, age=18, sex="男", city="北京"):
print(name, age, sex, city)
# 只修改city,其余使用默认
user("小李", city="上海")
# 修改age和sex
user("小张", age=25, sex="女")
输出:
小李 18 男 上海
小张 25 女 北京
四、多默认参数混合位置传参
位置参数会按顺序匹配,关键字参数不受顺序限制:
defcalc(a, b=2, c=3):
return a + b * c
print(calc(1)) # 1 + 2*3 =7
print(calc(1, 5)) # 1 +5*3=16
print(calc(1, c=10)) # 1+2*10=21
五、查看函数默认参数:__defaults__ 属性
可以查看函数保存的默认参数元组:
defdemo(x, a=10, b=[], c="hello"):
pass
print(demo.__defaults__)
# 输出:(10, [], 'hello')
六、常见实战场景
场景1:工具函数设置通用默认值
# 文件读取,默认编码utf-8
defread_file(path, encoding="utf-8"):
with open(path, "r", encoding=encoding) as f:
return f.read()
场景2:配置类函数,大量可选参数
defcreate_table(name, engine="InnoDB", charset="utf8mb4", auto_increment=1):
sql = f"CREATE TABLE {name} ENGINE={engine} CHARSET={charset} AUTO_INCREMENT={auto_increment}"
print(sql)
create_table("student")
create_table("user", charset="gbk")
七、总结重点
- 致命坑:可变对象(list/dict/set)直接作为默认参数会共享数据;
- 最佳实践:可变参数默认写
None,函数内动态创建容器; - 调用技巧:关键字参数可跳过前面默认值,单独修改指定参数。