博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的装包与拆包
阅读量:6330 次
发布时间:2019-06-22

本文共 1665 字,大约阅读时间需要 5 分钟。

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 12 (2, 3)3 对args拆包4 2 35 将未拆包的数据传给run17 输出元组8 ((2, 3),)9 对元组进行拆包10 (2, 3)6 将拆包后的数据传给run17 输出元组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://www.cnblogs.com/MisterZZL/p/9678468.html

你可能感兴趣的文章
Cocos2d-x 3.2 异步动态加载 -- 保卫萝卜开发总结
查看>>
聚焦触宝反侵权事件:中国创业者用什么护航海外市场大门
查看>>
AOP技术基础
查看>>
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(2)
查看>>
Lync 小技巧-5-当前已暂停共享
查看>>
无线802.11n 2.4G与5G性能测试
查看>>
子域名信息收集攻略
查看>>
[Android]开发数独游戏思路分析过程
查看>>
SpreadJS 类Excel表格控件 - V12 新特性详解
查看>>
理解并取证:IPv6与IPv4在报文结构上的区别
查看>>
EOS主网上线只是开始,如何运营决定未来
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
(译)如何使用cocos2d和box2d来制作一个Breakout游戏:第一部分
查看>>
计算机图形学(一) 图形系统综述
查看>>
持续集成(CI)- 几种测试的区别(摘录)
查看>>
多用户虚拟Web3D环境Deep MatrixIP9 1.04发布
查看>>
求高手,求解释
查看>>
[MSSQL]NTILE另类分页有么有?!
查看>>
winform datagridview 通过弹出小窗口来隐藏列 和冻结窗口
查看>>
Jquery闪烁提示特效
查看>>