zoukankan      html  css  js  c++  java
  • python中的装包与拆包

    python中的装包与拆包

    args和 **kwargs是在python的代码中经常用到的两个参数,初学者对这两个参数的理解可能仅仅限于args是用于接收多余的未命名参数,**kwargs用于接收形参中的命名参数,其中args是一个元组类型,而kwargs是一个字典类型的数据。

    其实这两个参数还涉及到了python中的一个重要的知识点,拆包与解包。这篇文章将会通过对这两个参数的拆开揉碎讲解,让小伙伴能对拆包解包有一些更深刻的认识。(我一直认为这个世界上只存在懂与不懂两种状态,从来没有什么似懂非懂)。

    *args

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

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

    下面是上面程序的输出结果:

    1 1
    2 (2, 3)
    3 对args拆包
    4 2 3
    5 将未拆包的数据传给run1
    7 输出元组
    8 ((2, 3),)
    9 对元组进行拆包
    10 (2, 3)
    6 将拆包后的数据传给run1
    7 输出元组
    8 (2, 3)
    9 对元组进行拆包
    10 2 3
    

    理解这段代码需要把握住下面几点:

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

    **kwargs

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

    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
    

    总结:

    1. *args作为形参时是用来接收多余的未命名参数,而**kwargs是用来接收key=value这种类型的命名参数,args是元组,kwargs是字典。

    2. *和**在函数体中除了拆包之外,并没有什么卵用。

    3. 装包的含义就是把未命名参数和命名参数分别放在元组或者字典中。

    转载于:https://blog.csdn.net/kobebryantlin0/article/details/73864848/

  • 相关阅读:
    集合(set)
    字典方法
    字典(dict)
    元组(tuple)
    列表方法
    xxxx(四):接受消息hook地址分析
    xxxx(三)“黑吃黑”: 破解别人外挂
    UDP内网穿透和打洞原理与代码实现
    VMP加壳(三):VMP壳爆破实战-破解某编辑类软件
    VMP加壳(二):VMP的虚拟化原理
  • 原文地址:https://www.cnblogs.com/MisterZZL/p/9678468.html
Copyright © 2011-2022 走看看