Python 函数参数详解:必选、默认、可变与关键字参数
本文深入解析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 函数中的参数类型,希望对大家有所帮助!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













