当前位置:首页>python>Python 函数默认参数完整教程

Python 函数默认参数完整教程

  • 2026-10-11 06:29:11
Python 函数默认参数完整教程

一、什么是默认参数

定义函数时,可以给形参指定默认值,调用函数时如果不传这个参数,会自动使用预设的默认值;如果手动传入实参,则覆盖默认值。

基础语法

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")

七、总结重点

  1. 默认参数作用:简化调用,给参数提供通用预设值;
  2. 语法约束:无默认参数在前,带默认在后;
  3. 致命坑:可变对象(list/dict/set)直接作为默认参数会共享数据;
  4. 最佳实践:可变参数默认写None,函数内动态创建容器;
  5. 调用技巧:关键字参数可跳过前面默认值,单独修改指定参数。

最新文章

随机文章