1.前言
Python
中函数的参数类型比较丰富,比如我们经常见到
*args
和
**kwargs
作为参数。初学者遇到这个多少都有点懵逼,今天我们来把
Python
中的函数参数进行分析和总结。
2.Python 中的函数参数
在Python中定义函数参数有5种类型,我们来一一演示它们。
2.1必选参数
必须参数是最基本的参数类型,当你在 Python 函数中定义一个必选参数时,每次调用都必须给予赋值,否则将报错。
>>>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
。我们来演示一个求和的函数: