Python 函数参数详解:必选、默认、可变与关键字参数

半杯拿铁
半杯拿铁
发布时间:2026-10-14| 3人浏览过
原创

本文深入解析Python函数的五种参数类型:必选参数、默认参数、可变参数(*args)、关键字参数(**kwargs)及命名关键字参数。重点剖析默认参数指向可变对象时的常见陷阱,并演示如何正确组合使用各类参数以实现灵活的函数调用。

Python 函数参数详解:必选、默认、可变与关键字参数

1.前言

Python 函数支持丰富的参数类型,例如常见的*args和**kwargs。初学者面对这些概念时往往感到困惑,本文将系统分析并总结 Python 函数参数的各类用法。

2.Python 中的函数参数

Python 中定义函数参数共有 5 种类型,下面将逐一进行演示说明。

必选参数

2.1必选参数

必选参数是最基础的参数类型。在定义函数时,若指定了必选参数,每次调用该函数时必须提供对应的值,否则程序将抛出错误。


>>>def fun(a):
    print("a=",a) 
  
>>>fun('felord.cn')
a= felord.cn
>>>fun()
Traceback (most recent call last):
 File "<input>", line 1, in <module>
TypeError: fun() missing 1 required positional argument: 'a'

默认参数

2.2默认参数

默认参数是指具有预设值的参数。


>>>def fun(a="felord.cn"):
    print("a=",a) 
  
>>>fun()
a= felord.cn
>>>fun("Felordcn")
a= Felordcn

观察以下示例:


>>>def fun(a=[]):
    a.append("foo")
    print("a=",a)
  
>>>fun()
a= ['foo']
>>>fun()
a= ['foo', 'foo']
>>>fun()
a= ['foo', 'foo', 'foo']

为何每次调用a时它似乎“记住”了之前的值?这是因为 Python 函数在定义阶段,默认参数a的值即被初始化为[]。实际上,a作为一个变量,指向了对象[]。每次调用函数并修改a的值时,实际改变的是a指针所指向的对象内容。若将a的默认值设为不可变对象,则不会出现此现象,读者可自行验证。

因此,定义默认参数时需牢记一条原则:默认参数必须指向不可变对象!

可变参数

2.3可变参数

在许多场景中,我们不确定传入参数的数量,即参数是可变的。起初可能会想到使用list或tuple(元组)来封装多个参数,但如何从函数语义上识别这是可变参数呢?我们通过前缀标识*来声明该参数为可变参数,通常记作*args,也可记作*params。args会将所有传入的参数收纳为一个tuple。以下演示一个求和函数:


>>>def calc(*args):
    total=0
    for i in args:
      total+=i
    return total    
 
>>>calc(1)
1
>>>calc(1,2,3,4,5)
15
>>>calc()
0

关键字参数

2.4关键字参数

关键字参数也是实现任意数量参数传递的一种方式,其区别在于:可变参数将参数收纳为tuple,而关键字参数则将传入的参数名及其对应值收纳为dict(字典)。通常记作**kwargs以区别于可变参数,实际上kw是keyword的缩写。让我们尝试一下:


>>>def mapper(**kwargs):
    print(kwargs)
  
>>>mapper()
{}
>>>mapper(name="felord.cn")
{'name': 'felord.cn'}

命名关键字参数

2.5命名关键字参数

对于普通关键字参数,调用者可传入任意数量的关键字参数。若需在函数内部显式检查传入的关键字,往往需要编写与意图无关的样板代码。Python 是否限制了关键字参数的名称?答案是肯定的,我们可以使用命名关键字参数来实现这一限制。在*,之后紧跟的连续非可变参数和非关键字参数即为命名关键字参数。演示如下:


>>>def info(name,*,age,city):
    print("name=",name,"age=",age,"city=",city)
   
>>>info("felord.cn")
Traceback (most recent call last):
 File "<input>", line 1, in <module>
TypeError: info() missing 2 required keyword-only arguments: 'age' and 'city'
>>>info("felord.cn",city="beijing",age=20)
name= felord.cn age= 20 city= beijing

通过上述示例,你可能发现了其他规律。此外,命名关键字参数也可设置默认值,但传参时必须显式指定 keyword。


>>>def info(name,*,age=20,city):
    print("name=",name,"age=",age,"city=",city)
  
>>>info("felord.cn",city="beijing")
name= felord.cn age= 20 city= beijing
>>>info("felord.cn","beijing")
Traceback (most recent call last):
 File "<input>", line 1, in <module>
TypeError: info() takes 1 positional argument but 2 were given

参数组合

3.参数组合

这 5 种参数可以组合使用,但参数定义的顺序必须严格遵循:必选参数、默认参数、可变参数/命名关键字参数,最后是关键字参数。需特别注意,可变参数无法与命名关键字参数混合使用。对于任意函数,均可通过类似function(args, *kw)的形式进行调用,无论其参数如何定义。受篇幅限制,不再逐一举例,读者可自行测试。

4. 总结

Python 函数具备非常灵活的参数形态,既能实现简单调用,也能处理复杂参数。其中包含诸多细节,掌握参数类型是学习 Python 函数的关键知识点。

以上所述是小编给大家介绍的python 函数中的参数类型,希望对大家有所帮助!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。