【Python笔记】*args与**kwargs

时间:2021-07-10 21:26:45

一、描述

  • *args:任意个无名参数,类型为tuple或list
  • **kwargs:任意个关键字参数(key-word args,键值对),类型为dict

二、功能

  • 任意数目参数的接收
  • 集合参数的分解

1.任意数目参数的接收——打包操作

示例(函数传参):

def func(a,*arg,**kwargs):#*args需放在**kwargs之前,否则出现语法错误
    print(a)
    print(arg)
    print(kwargs)

func(1,2,3,4,key1=1,key2=2)
func(1,2,3,4,{'key1:1,key2:2'})

输出:

1
(2, 3, 4)    #将参数转换为tuple类型
{'key1': 1, 'key2': 2}    #将参数转换为dict类型
---------------------------------------
1
(2, 3, 4, {'key1:1,key2:2'})   
{}
#字典形式非独立的键值对(字典是打包好的键值对)
#会以整体形式被*args识别为无名参数

示例(赋值操作):

_,*args,_=[1,2,3,4]    #_表示占位,接收一个元素赋值后丢弃
*args=[1,2,3,4]

输出:

[2, 3]    #*args在赋值操作中将元素打包为list,在函数中将元素打包为tuple
----------------------------------------------------
starred assignment target must be in a list or tuple
#*args必须出现在列表或元组中
#对于_,*args,_=[1,2,3,4]无报错,个人理解该形式组成了一个序列

2.集合参数的分解——解包操作

示例:

def func1(a,b,*args):
    print(a)
    print(b)
    print(args)

def func2(a,c,**kw):
    print(a)
    print(c)
    print(kw)
    
func1(*[1,2,3,4])
func2(**{'a':1,'b':2,'c':3,'d':4})

输出:

1
2
(3, 4)    #3,4被*args接收并重新打包
----------------------------------
1
3
{'b': 2, 'd': 4}   

#**{'a':1,'b':2,'c':3,'d':4}将dict解包
#区别于字典整体,作为独立键值对可被**kw接收
#a,c键接收对应值,b,d键值对被**kw接收并重新打包

三、总结

  • *args可实现任意无名参数的tuple or list打包,tuple or list 的解包
  • **kwargs可实现任意键值对的dict打包,dict 的解包
  • 对无名参数或键值对的解包操作、tuple/list/dict的打包操作均会报错,注意使用*或**操作时对象的状态

四、引用

本文引用徐玖python,在此感谢!