21.Python基础18_装包与拆包

args和 **kwargs是在python的代码中经常用到的两个参数,理解可能仅仅限于args是用于接收多余的未命名参数,**kwargs用于接收形参中的命名参数,其中args是一个元组类型,而kwargs是一个字典类型的数据。
其实这两个参数还涉及到了python中的一个重要的知识点,拆包与解包。

  • *args和 **kwargs放在形参中是装包,放在函数体中是拆包;
  • args和kwargs是装包后的结果;

1.*args

先看下面这段代码,挺住别晕,哈哈。

def run(a,*args):
    #第一个参数传给了a
    print(a)
    # args是一个元组,里面是2和3两个参数
    print(args)
    # *args是将这个元组中的元素依次取出来
    print("对args拆包")
    print(*args) # *args 相当于 a,b = args
    print("将未拆包的数据传给run1")
    run1(args)
    print("将拆包后的数据传给run1")
    run1(*args)
 
def run1(*args):
    print("输出元组")
    print(args)
    print("对元组进行拆包")
    print(*args)
 
run(1,2,3) #后面的2和3

运行结果:

1
(2, 3)
2 3
将未拆包的数据传给run1
输出元组
((2, 3),)
对元组进行拆包
(2, 3)
将拆包后的数据传给run1
输出元组
(2, 3)
对元组进行拆包
2 3

理解这段代码需要把握住下面几点:
1.形参中的args其实真正接收数据的args,它是一个元组,把传进来的数据放在了args这个元组中。
2. 函数体里的args依然是那个元组,但是
args的含义就是把元组中的数据进行拆包,也就是把元组中的数据拆成单个数据。
3. 对于args这个元组,如果不对其进行解包,就将其作为实参传给其它以*args作为形参的函数时,args这个元组会看看作一个整体,作为一个类型为元组的数据传入。
把握上面的这三点,就不会被刚才的程序绕晕了。

2. **kwargs

如果对上面的args理解了,那么这个kwargs也就不难理解了,把这两个类比成之前的一个,接下来程序的所有执行结果都可以得到合理的解释。

但是**kwargs是不能像之前*args那样被打印出来看的

def run(**kwargs):#传来的 key = value 类型的实参会映射成kwargs里面的键和值
       # kwargs是一个字典,将未命名参数以键值对的形式
       print(kwargs)
       print("对kwargs拆包")
       #  此处可以把**kwargs理解成对字典进行了拆包,{"a":1,"b":2}的kwargs字典又
       # 被拆成了a=1,b=2传递给run1,但是**kwargs是不能像之前*args那样被打印出来看的
       run1(**kwargs)
       #print(**kwargs)
   def run1(a,b): #此处的参数名一定要和字典的键的名称一致
      print(a,b)
 
run(a=1,b=2)

运行结果:

{'a': 1, 'b': 2}
对kwargs拆包
1 2

你可能感兴趣的:(Python基础)