本文摘录自FishC。我觉得很实用,就写下来了。
星号(*)作为形参的时候起到“打包”的作用;相反,作为实参时起到“解包”得作用;
1)星号(*)作为形参,表示调用可变参数函数
通过在形参前加一个星号(*)或两个星号(**)来指定函数可以接受任意数量的实参;
def fun1(*args):
print(type(args))
print(args)
fun1(1,2,3,4,5)
输出:
<class 'tuple'>
(1, 2, 3, 4, 5)
def fun2(**args):
print(type(args))
print(args)
fun2(a=1,b=2,c=3,d=4,e=5)
输出:
<class 'dict'>
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
从上面可以看出,当参数形如*args时,传递给函数的任意个实参会按位置打包成一个元祖(tuple);
当参数形如**args时,传递给函数的任意个key=value实参会被打包成一个字典(dict);
2)星号(*)作为实参,表示通过解包参数调用函数
有打包就有解包,通过在实参前加一个星号(*)或两个星号(**)来对列表(list),元祖(tuple)或字典(dict)进行解包;
>>> a=[1,2,3,4,5]
>>> b=(1,2,3,4,5)
>>> fun1(*a)
<class 'tuple'>
(1, 2, 3, 4, 5)
>>> fun1(*b)
<class 'tuple'>
(1, 2, 3, 4, 5)
>>> c={'one':1,'two':2,'three':3}
>>> fun2(**c)
<class 'dict'>
{'one': 1, 'two': 2, 'three': 3}
一个星号(*)用来打包和解包系列,两个星号(**)用来打包和解包字典。