python中*args和**kwargs用法

  • *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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值