关于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 ...
随机推荐
- AO-XXXX
一 AO4419:应用于开关应用或PWM应用的场效应管.
- hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!
http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE, 更重要的是找出规律后,O(n)递推也过不了,TLE,一定 ...
- JDBC——入门知识【转】
1. 什么是JDBC:Java数据库连接性(JavaDatabase Connectivity) API,允许用户从Java应用程序中访问任何表格化数据源. 2. JDBC除了提供到更宽范围的SQ ...
- php使用json_decode返回NULL
php5.2以后自带json_decode函数,但是对json文本串的格式要求非常严格. 很可能使用该函数得到的返回值是NULL 可以使用使用json_last_error()函数获取到的返回值来帮助 ...
- Jquery 中使用String.Format
第一种方法: String.format = function() { if (arguments.length == 0) return null; var str = arguments[0]; ...
- MyBatis -- 必知必会
MyBatis的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.201 ...
- MSDN值得学习的地方
作者:朱金灿 来源:http://blog.csdn.net/clever101 我一直认为:如果你没有乔布斯那样的天才,能够从头脑中原创出好产品,那么最好先学习分析好的产品,它到底好在哪里?哪些地方 ...
- C++模板类头文件和实现文件分离
http://www.cnblogs.com/lvdongjie/p/4288373.html 如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关. 引用<<C++primer ...
- 获取登陆信息 在created()方法中
// 获取登录信息 public async InitUser() { await sj.globalVar.Init(true); this.params.unitId = sj.globalVar ...
- 谈谈你对Application类的理解
其实说对什么的理解,就是考察你对这个东西会不会用,重点是有没有什么坑! 首先,Application在一个Dalvik虚拟机里面只会存在一个实例,所以你不要傻傻的去弄什么单例模式,来静态获取Appli ...