【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 异常。

 
 
 
 
 
 

参考资料

1. python中的*args和**kwargs

posted @ 2023-06-01 22:33  苏格拉底的落泪  阅读(17)  评论(0编辑  收藏  举报