Python函数参数之*与**用法详解

首先,我们来看一个函数定义:

1
2
def f(a,*b,**c):
print(f'a:{a},b:{b},c:{c}')

*b与**c都是可变参数

  • 出现带一个星号的参数 b,这是可变位置参数
  • 带两个星号的参数 c,这是可变关键字参数

首先,我们来看一个函数定义:

1
2
def f(a,*b,**c):
print(f'a:{a},b:{b},c:{c}')

*b与**c都是可变参数

  • 出现带一个星号的参数 b,这是可变位置参数
  • 带两个星号的参数 c,这是可变关键字参数

现在执行如下代码:

1
2
In [2]: f(1,2,3,w=4,h=5)
a:1,b:(2, 3),c:{'w': 4, 'h': 5}

可以看到,参数 b 被传递 2 个值,参数 c 也被传递 2 个值。可变位置参数 b 被解析为元组,可变关键字参数 c 被解析为字典

下面有几个重要规则:

(1)可变位置参数不能传入关键字参数

1
2
3
4
5
6
7
8
9
10
11
12
In [41]: def f(*a):
...: print(a)
In [42]: f(1)
(1,)
In [43]: f(1,2,3)
(1, 2, 3)
In [44]: f(a=1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-44-6a0ab2c303a9> in <module>
----> 1 f(a=1)
TypeError: f() got an unexpected keyword argument 'a'

(2) 可变关键字参数不能传入位置参数

1
2
3
4
5
6
7
8
9
10
11
12
In [45]: def f(**a):
...: print(a)
In [46]: f(a=1)
{'a': 1}
In [47]: f(a=1,b=2,width=3)
{'a': 1, 'b': 2, 'width': 3}
In [48]: f(1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-48-281ab0a37d7d> in <module>
----> 1 f(1)
TypeError: f() takes 0 positional arguments but 1 was given