Python3 * 和 ** 形参
不定参数
*args 和 **kwargs 主要用于函数定义。
我之前学习c等也见过相似的行为,如print()可以携带不少参数。
同理,python函数传递参数的方式有两种:
- 位置参数(positional argument)
- 关键词参数(keyword argument)
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
- *args 表示任何多个无名参数,它本质是一个 tuple 即是一个顺序位置相关的参数
- **kwargs 表示关键字参数,它本质上是一个 dict 可以与顺序无关,按照key值匹配参数,因此称为关键词参数。
看下面第二个例子
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
>>> def fun(*args, **kwargs):
... print('args=', args)
... print('kwargs=', kwargs)
...
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
args= (1, 2, 3, 4)
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
*args 与**kwargs
>>> def fun(data1, data2, data3):
... print("data1: ", data1)
... print("data2: ", data2)
... print("data3: ", data3)
...
>>> args = ("one", 2, 3)
>>> fun(*args)
data1: one
data2: 2
data3: 3
#字典 会根据key值代入到不同的参数中,与顺序无关。
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
>>> fun(**kwargs)
data1: 3
data2: 2
data3: one
序列解包
>>> a, b, *c = 0, 1, 2, 3
>>> a
0
>>> b
1
>>> c
[2, 3]