*和**的用法看到太多了,总结下其中的一些细节
【1】*的用法
*是可以接受任意数量的参数,比如如下代码:
x=['x','y','z','q']
def m(*args):
print(args)
m(x[0],x[1],x[2],x[3])
#args:('x', 'y', 'z', 'q')
【2】**的用法
而**可以接受任意数量的指定键值的参数,比如如下代码:
def m(**kwargs):
print(kwargs)
m(a=1,b=2)
#kwargs:{'b': 2, 'a': 1}
可见区别就是**会将指定的参数变成一个dict,如果要传递的参数想传入任意数量的参数以及指定键值的参数,可用如下代码:
def m(*args,**kwargs):
print(args)
print(kwargs)
m(1,2,a=1,b=2)
#args:(1,2),kwargs:{'b': 2, 'a': 1}
需要注意的是,比如上述代码中,我们不可以在指定键值的参数后面再加任意参数m(1,2,a=1,b=2,3,4)
,这种写法是错误,程序会报错SyntaxError: positional argument follows keyword argument
,这个需要记住。
【3】对参数使用*
有时候会看到在使用某个参数的时候会在它前面加上*号,其实这个就是对tupple进行解析。比如如下代码:
x=['x','y','z','q']
def man(aaa,bbb,*args):
print(aaa)
print(bbb)
print(args)
m = man(*x)
#输出
x
y
('z', 'q')
可见列表被解析了,而且因为args之前有两个值,所以args中只保留了后两个值,这是一个需要注意的细节,同理**也有这种细节
【4】对参数使用**
比如有如下代码:
x={'aaa':222,'bbb':111,'name':'kairen'}
def m(aaa,bbb,**kwargs):
print(aaa)
print(bbb)
print(kwargs)
m = m(**x)
#输出
222
111
{'name': 'kairen'}
可见这个和之前的一样,参数也被解析了,值得注意的,因为这个是按照键值对应的,所以函数中的参数必须要和x中的键值一致,否则报错。
看一个可能会让人看迷糊的代码:
l=[1,2,3]
x={'aaa':222,'bbb':111,'name':'kairen'}
def m(*args,aaa,bbb,**kwargs):
print(args)
print(aaa)
print(bbb)
print(kwargs)
m = m(*l,**x)
#输出
(1, 2, 3)
222
111
{'name': 'kairen'}
可是如果改为m(aaa,bbb,*args,**kwargs)
就报错了,不过这种写法真是作死了,一般就写成如下代码:
l=[1,2,3]
x={'aaa':222,'bbb':111,'name':'kairen'}
def m(*args,**kwargs):
print(args)
print(kwargs)
m = m(*l,**x)
输出为
(1, 2, 3)
{'name': 'kairen', 'aaa': 222, 'bbb': 111}
对参数进行解析的话我们就可以传入多个list参数,比如下代码:
l=[1,2,3]
ll =[1,2,3]
x={'aaa':222,'bbb':111,'name':'kairen'}
def m(*args,**kwargs):
print(args)
print(kwargs)
m = m(*l,*ll,**x)
输出
(1, 2, 3, 1, 2, 3)
{'aaa': 222, 'name': 'kairen', 'bbb': 111}
个人的一些总结,有不足之处请留言,谢谢!