- *args 表示可变无键参数,tuple类型;
- **kwargs 表示可变有键参数,dict类型
- 同时使用*args和**kwargs时,必须*args参数列要在**kwargs前(位置参数在关键字参数的前面)
实践:
def foo(*args, **kwargs):
print(f"args={args}")
print(f'kwargs={kwargs}')
print('------------------------------')
if __name__=="__main__":
foo(1,2,3,4)
foo(a=1,b=2,c=3)
foo(1,2,3,4,a=1,b=2,c=3)
foo('a',1,None,a=1,b=2)
################ 输出:
args=(1, 2, 3, 4)
kwargs={}
------------------------------
args=()
kwargs={'a': 1, 'b': 2, 'c': 3}
------------------------------
args=(1, 2, 3, 4)
kwargs={'a': 1, 'b': 2, 'c': 3}
------------------------------
args=('a', 1, None)
kwargs={'a': 1, 'b': 2}
------------------------------
还可以根据**kwargs创建字典
def kw_dict(**kwargs):
return kwargs
print(kw_dict(a=1,b=2,c=3))
################ 输出:
{'a': 1, 'b': 2, 'c': 3}
如果已知两个位置参数,然后再接*args,**kwargs
def fun(a,b,*args, **kwargs):
print(f'a={a},b={b}')
print(f'args={args}')
print(f'kwargs={kwargs}')
print('---------------------')
if __name__== "__main__":
fun(1,2,1,2,3,k=1,t=2)# 先按形参a,b个数分配1,2,再将其他分为可变无名参数和可变有键参数中
fun(1,2,3,4)
############## 输出
a=1,b=2
args=(1, 2, 3)
kwargs={'k': 1, 't': 2}
---------------------
a=1,b=2
args=(3, 4)
kwargs={}
---------------------
但是当对a,b赋值进行传入时
fun(a=1,b=2,3,4)
########## 输出
fun(a=1,b=2,3,4)
^
SyntaxError: positional argument follows keyword argument
位置参数应该位于有键参数前面,但是上面args在有键参数后。
将*args放在最前面时
def fun(*args, a,b,**kwargs):
print(f'a={a},b={b}')
print(f'args={args}')
print(f'kwargs={kwargs}')
fun(1,2,4,a=1,b=3, c=5)
############# 输出
a=1,b=3
args=(1, 2, 4)
kwargs={'c': 5}
将*args放在参数中间时
def fun(a,*args,b,**kwargs):
print(f'a={a},b={b}')
print(f'args={args}')
print(f'kwargs={kwargs}')
fun(1,2,4,b=3,c=5)
############### 输出
a=1,b=3
args=(2, 4)
kwargs={'c': 5}