关于Python中包裹传参和解包裹的理解
1.包裹传参
首先思考一个问题:为什么要有包裹传参?原因包括但不仅限于以下两点:①不确定参数的个数。②希望函数定义的更加松散灵活
包裹传参分两种:包裹位置传参和包裹关键字传参。先看包裹位置传参:
在这里,如果先说定义肯定有些晦涩难懂,我们直接看下面这个例子吧!
def package_position(*all_arguments):
print(type(all_arguments))
print(all_arguments)
这里定义了一个函数package_position(),其传入参数与一般的参数不一样,前面有一个*号,表明这是一个包裹,接下来调用的时候如下:
package_position(1, 4, 6)
package_position(5, 6, 7, 1, 2, 3)
那么打印的结果呢,是这样的:

根据函数的定义,我们知道,打印的第一行是传入的参数的类型(即type),根据打印结果,我们知道这是一个tuple,即元祖类型。也就是说,当我们在调用这个方法的时候,传入的参数1,4,6,最后全部包在一起,封装成一个tuple,传递给函数内部。打印的第二行,就是该元祖的内容。然后,根据打印结果的第二行,我们可以知道,这就是我们在调用时传入的1,4,6。
总结一下:在调用package_position()时,所有的数据都根据先后顺序,收集到一个元祖,在函数内部,我们可以通过元祖来读取传入的数据,这就是包裹位置传参。
再来看看什么时包裹关键字传参:
有了以上包裹位置传参,那么包裹关键字传参就不多说了,还是直接看例子:
def package_keyword(**all_arguments):
print(type(all_arguments))
print(all_arguments) package_keyword(a = 1, b = 9)
package_keyword(m = 2, n = 1, c = 11)
与上面一个例子类似,当函数调用时,所有参数会收集到一个数据容器里。只不过,在包裹关键字传递的时候,,数据容器不再是一个元祖,而时一个字典。每个关键字形式的参数调用,都会成为字典的一个元素。参数名为元素的键,而数据成为元素的值。字典all_arguments收集了所有的参数,把数据传递给函数使用。为了提醒,参数all_arguments是包裹关键字传递所有的字典,因此在all_arguments前加**。打印结果如下:

2.解包裹
def unpackage(a, b, c):
print(a, b, c) args = (1, 3, 4)
unpackage(*args) args = {"a":1, "b":2, "c":3}
unpackage(**args)
根据上面的代码,估计读者也大概知道了关于解包裹的概念。我们调用函数时传递的是一个元祖,按照基本传参的方式,一个元祖是无法和三个参数对应上的。但我们通过在args前加上*符号,来提醒Python,我想把元祖拆成三个元素,每一个元素对应函数的一个位置参数。于是,元祖的三个元素分别赋予了三个参数。
相应的,词典也可用于解包裹(上述代码第7,8行)。在传递词典args时,让词典的每个键值对作为一个关键字传递给函数。
关于Python中包裹传参和解包裹的理解的更多相关文章
- Python中的传参是传值还是传址?
传值:在C++中,传值就是把一个参数的值给这个函数,其中的更改不会影响原来的值. 传址:即传引用,直接把这个参数的内存地址传递进去,直接去这个内存地址上进行修改. 但是这些在Python中都没有,Py ...
- python中一些传参事情
#一个参数的传参 def hello(a): print(a+'王彦军你好')hello('hello')''' #2个参数的 def ab(a,b): print(a+'你好') ...
- 验证python中函数传参是引用传递
定义: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...
- 在Java中动态传参调用Python脚本
最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...
- python 2 控制台传参,解包,编码问题初探
python 2 控制台传参,需要从sys模块中导入argv,argv返回的第一个参数当前脚本(script)的文件名,后面是参数,参数个数必须和解包(unpack)时使用的参数个数一致 1.本例子演 ...
- Vue-CLI项目中路由传参
Vue-CLI项目中路由传参 一.标签传参方式:<router-link></router-link> 第一种 router.js { path: '/course/detai ...
- apiCloud中openFrameGroup传参
apiCloud中openFrameGroup传参 1.无效的 api.openFrameGroup({ // 打开 frame 组 name: 'group', scrollEnabled: fal ...
- Vue-cli中axios传参的方式以及后端取的方式
0917自我总结 Vue-cli中axios传参的方式以及后端取的方式 一.传参 params是添加到url的请求字符串中的,用于get请求. data是添加到请求体(body)中的, 用于post请 ...
- Python菜鸟之传参
Python菜鸟之传参 : 看上面enroll( )函数的调用传参 enroll("twiggy","M",city="上海", age=2 ...
随机推荐
- 7天学完Java基础之5/7
接口 接口就是一种公共的规范标准 是一种引用数据类型 定义格式 public interface 接口名称{} java7 中接口可以包含常量,抽象方法:Java8 还可以额外包含默认方法,静态方法: ...
- RobotFrameWork自动化系列:安装配置
1. RobotFrameWork安装配置 1.1. 安装环境 64位win10家庭中文版 网上很多这方面的教程,但是比较零散,这里是自己安装配置的一个简单的笔记. 1.2. 安装说明 由于Rob ...
- CH#56C(LCA+dfs序)
题目传送门 性质是:把节点dfs序以后,异象石按这个序号排序,然后相邻两两求树上距离,这些距离的和除以二就是最小斯坦纳树. 插入删除的具体操作是根据我们上述性质,用一个set维护dfn,比如插入x,则 ...
- noip初赛
运算符 联结词名称 异或 ⊕ 非¬(-) 否定 与∧(·) 对应集合∩交集 对应按位与符号& 合取 或∨(+) 对应集合∪并集 对应按位或符号| 析取 条件→ ...
- 搜狐前端css常用命名
- 分区表,磁盘概念和parted的使用
分区表,磁盘概念和parted的使用 登录陌生系统首先要做的事: 个人认为,首先得知道Linux版本的什么:cat /etc/issue df:查看磁盘的分区和数据的分配情况,类型(NFS,ext4. ...
- angularjs 下select中ng-options使用
当我有一堆object数据要用下拉框进行显示选择时,可以使用到angularjs中的select中的ng-options的属性.官网网址:https://docs.angularjs.org/api/ ...
- QProcess执行带管道的shell命令
QStringList options; options << "-c" << "ls -l | grep a | sort"; QPr ...
- TFS2010单独安装配置tfs build server
记录一下确实很磨人. 同样硬件和软件环境的两台服务器,其中一台服务器很久之前就配置好了tfs2010 build ,然后最近想再配置一台tfs build server,但是按照以前的配置流程始终提示 ...
- C# 获取本机IP(优化项目实际使用版)
好一段时间没来更新博客了,因为密码实在记不住,烦死了,密码干脆直接用那个找回密码链接的一部分. 吐槽完说正事了,关于C# 获取本机IP的,最开始用的是下面的,但是因为获取IP的有点多,而且难判断,忽 ...