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/

python中的装包与拆包的更多相关文章

  1. [19/10/13-星期日] Python中的函数

    一.函数 # 第五章 函数 ## 函数简介(function) - 函数也是一个对象 - 对象是内存中专门用来存储数据的一块区域 - 函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行 ...

  2. Python中使用Mysql(安装篇)

    准备工作 import MySQLdb Linux系统自带了Python,但并不是都有这个包,至少我每次拿到一台全新的服务器时候,都发现没有装这个包. 这个东西的下载地址是 http://source ...

  3. python中函数的参数解析

    python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...

  4. 在python中的使用Libsvm

    http://blog.csdn.net/pipisorry/article/details/38964135 LIBSVM是台湾大学林智仁(LinChih-Jen)教授等开发设计的一个简单.易于使用 ...

  5. 操作系统底层原理与Python中socket解读

    目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...

  6. Python中星号的本质和使用方式

    翻译:Python 开发者 - 一汀, 英文:Trey Hunner http://blog.jobbole.com/114655/ Python开发者 在 Python 中有很多地方可以看到*和** ...

  7. python中的pip

    python中的pip python有两个著名的包管理工具,其中,pip是一个.它对python的包进行管理和升级等操作. 问题一:pip本地的模块安装在哪里? 使用pip install numpy ...

  8. 查看python中模块的所有方法

    查看python中模块的所有方法     安装的python模块,现将查看方法总结如下 一.CMD命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交 ...

  9. python中TCP协议中的粘包问题

    TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...

随机推荐

  1. js 性能优化利器:prepack

    1. js 性能优化 js 本身是没有像 python 一样的预编译功能,更没有像 java 一样的编译功能,所以,这里所说的 js 代码预编译 只是通过工具实现的类似功能而已. 这就要提到 prep ...

  2. SQL递归方式实现省市区县级别查询

    数据库脚本 CREATE TABLE [dbo].[Std_Area]( [Id] [int] NOT NULL, [Name] [nvarchar](50) NULL, [ParentId] [in ...

  3. mysql插入报主键冲突,解决方法主键索引重新排序

    1.备份表结构 create table table_bak like table_name; 2.备份表数据 insert into table_bak select * from table_na ...

  4. SudaMod-81.0 / crDroidAndroid-8.1(android-8.1.0_r20)红米3 2018年5月3日更新

    一.写在前面 我只是个人爱好,本ROM未集成任何第三方推广软件,我只是喜欢把好的资源分享出来,若可以,我们一起学习,一起进步. 请不要问我怎么刷机! 请不要问我玩游戏卡不卡(有钱你就换好点的手机)! ...

  5. 关于C#中遍历字符串中的每个字符的方法

    解决方案 C#提供了两个方法用于遍历字符串. 1.第一个方法是foreach循环,这个方法快速且容易,但是与第二个方法相比它不太灵活.其使用方法如下: string testStr = "a ...

  6. C#项目”XXXXX”针对的是”.NETFramework,Version=v4.7.1”但此计算机没有安装它

    遇到这样一个问题:C#项目”XXXXX”针对的是”.NETFramework,Version=v4.7.1”但此计算机没有安装它 就是我在打开别人的项目,发现别人的项目.Net Framework的版 ...

  7. Java & PHP & Javascript 通用 RSA 加密 解密 (长字符串)

    系统与系统的数据交互中,有些敏感数据是不能直接明文传输的,所以在发送数据之前要进行加密,在接收到数据时进行解密处理:然而由于系统与系统之间的开发语言不同. 本次需求是生成二维码是通过java生成,由p ...

  8. Kafka认证权限配置(动态添加用户)

    之前写过一篇Kafka ACL使用实战,里面演示了如何配置SASL PLAINTEXT + ACL来为Kafka集群提供认证/权限安全保障,但有一个问题经常被问到:这种方案下是否支持动态增加/移除认证 ...

  9. Excel导入工具类兼容xls和xlsx

    package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import or ...

  10. 四、Sql Server 基础培训《进度4-插入数据(实际操作)》

    知识点: 假设有订单表 CREATE TABLE Order ( ID int identity(1,1) not null primary key, --内码 BillNo varchar(100) ...