【python】函数参数单星号 "*" 和双星号 "**"
函数参数 * 和 **
在Python中,函数参数列表中的 * 和 ** 具有特殊的含义。
* 用于表示一个元组(tuple),它将不定数量的位置参数存储为一个元组。当我们无法确定传递给函数的位置参数的数量时,可以使用 * 参数。例如:
def test_args(first, *args):
print('Required argument: ', first)
print(type(args))
for v in args:
print ('Optional argument: ', v)
test_args(1, 2, 3, 4)
第一个参数是必须要传入的参数,所以使用了第一个形参,而后面三个参数则作为可变参数列表传入了实参,并且是作为元组tuple来使用的。代码的运行结果如下:
Required argument: 1
<class 'tuple'>
Optional argument: 2
Optional argument: 3
Optional argument: 4
** 用于表示一个字典(dictionary),它将不定数量的关键字参数存储为一个字典。当我们无法确定传递给函数的关键字参数的数量时,可以使用 ** 参数。例如:
def test_kwargs(first, *args, **kwargs):
print('Required argument: ', first)
print(type(kwargs))
for v in args:
print ('Optional argument (args): ', v)
for k, v in kwargs.items():
print ('Optional argument %s (kwargs): %s' % (k, v))
test_kwargs(1, 2, 3, 4, k1=5, k2=6)
正如前面所说的,args类型是一个tuple,而kwargs则是一个字典dict,并且args只能位于kwargs的前面。代码的运行结果如下
Required argument: 1
<class 'dict'>
Optional argument (args): 2
Optional argument (args): 3
Optional argument (args): 4
Optional argument k2 (kwargs): 6
Optional argument k1 (kwargs): 5
可以通过函数名后面加上一对小括号来调用函数,并将需要传递的参数放在括号内。同时,也可以使用 * 和 ** 运算符来传递参数。例如,我们定义了一个函数:
def my_func(a, b, c):
print(a, b, c)
可以这样调用:
my_func(1, 2, 3) # 输出 1 2 3
也可以这样调用:
args = (1, 2, 3)
my_func(*args) # 输出 1 2 3
kwargs = {'a': 1, 'b': 2, 'c': 3}
my_func(**kwargs) # 输出 1 2 3
注意:在使用 * 和 ** 传递参数时,元组或字典中的元素数量必须与函数定义中的参数数量匹配。否则,会抛出 TypeError 异常。