python参数传递_python中的*和**参数传递机制
python的参数传递机制具有值传递(int、float等值数据类型)和引用传递(以字典、列表等非值对象数据类型为代表)两种基本机制以及方便的关键字传递特性(直接使用函数的形参名指定实参的传递目标,如函数定义为def f(a,b,c),那么在调用时可以采用f(b=1,c=2,a=3)的指定形参目标的传递方式,而不必拘泥于c语言之类的形参和实参按位置对应)
除此之外,python中还允许包裹方式的参数传递,这未不确定参数个数和参数类型的函数调用提供了基础:
def f(*a,**b)
包裹参数传递的实现是在定义函数时在形参前面加上*或**,*所对应的形参(如上面的a)会被解释为一个元组(tuple,而**所对应的形参(如上面的b)会被解释为一个字典。具体调用时参数的传递见下面的代码:
def f(*a,**b):print(a)print(b)
a=3b=4f(a,b,m=1,n=2)
上面代码的运行结果是:
(3, 4)
{'n': 2, 'm': 1}
可见,对于不使用关键字传递的变量,会被作为元组的一部分传递给*a,而使用关键字传递的变量作为字典的一部分传递给了**b。
同时有个tricky的地方,python中规定非关键字传递的变量必须写在关键字传递变量的前面,所以混合使用*和**时肯定时*形参在**形参的前面。
此外,在进行函数调用时,与之配套的就有个被称为解包裹的方式:
def f(*a,**b):print(a)print(b)
c=3d=4h=(c,d)
k={"m":1,"n":2}
f(*h,**k)
上面代码的输出与前面一致。
把元组或字典作为参数传入时,如果要适配包裹形式的形参定义(如上面将h传给*a,k传给**b),按照元组用*,字典用**的方式“解包裹”传递即可。
实际上,在调用f时使用*,是为了提醒Python:我想要把实参h拆成分散的2个元素c和d,进行分别传递(所有上面代码中的f定义成def f(arg1,arg2,**b)也是可以的,这样arg1会获得3这个值而arg2会获得4这个值)。**同理类似。另外,解包裹时*对于列表([]定义的为列表,()定义的为元组)也适用。
deff(c,d,n,m):print(c)print(d)print(m)print(n)
a=3b=4h=[a,b]
k={"m":1,"n":2}
f(*h,**k)
上面的输出是
3
4
1
2
与前面所述相符,因此要注意,对于**k这种字典的解包裹,要求函数的形参名和字典中的key值对应,
上面的例子中如果把def f(c,d,n,m)中的n改为其它的字母就会报错
有了包裹传递后,调用函数时就可以传递任意数量的参数,而由于元组和字典都是有__len__方法可以获得其元素个数的,所以在编写函数时可根据这一信息对不同的参数数目进行不同处理。
python参数传递_python中的*和**参数传递机制相关推荐
- python函数可选参数传递_Python中函数的参数传递
1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> print add ...
- python命令行参数传递_Python中 命令行参数传递 与 处理
英文原文: http://www.artima.com/weblogs/viewpost.jsp?thread=4829 很多人会在 if __name__ == "__main__&quo ...
- python有向图_Python 中的垃圾回收机制
一.概述 python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略. 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的 ...
- 参数 中_Python中函数的参数传递
Python中函数的参数传递 一.在函数的调用时,python解析器不会检查参数的类型,其中实参传递的可以是任意类型的对象(数值型.布尔型.字符串.列表.字典.元组甚至函数). 实例: 结果: 二.在 ...
- 简述python垃圾回收机制_python中的垃圾回收机制简述
2020年12月5日21:47:35 王凯玉 python中的垃圾回收机制 引用计数 # 引用计数 引用计数是编程语言中的一中内存管理技术,可以将资源的被引用次数保存起来. 当引用计数为0时,资源将被 ...
- java 参数传递_java中方法的参数传递机制
无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些.闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递. 这里的内存模型涉及到 ...
- python字符集_PYTHON 中的字符集
Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...
- python参数化_Python 中如何实现参数化测试的方法示例
之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest.nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架. 本文想针对测试中一种很常见的测试场景,即参 ...
- kafka python框架_Python中如何使用Apache Avro——Apache的数据序列化系统
了解如何创建和使用基于Apache Avro的数据,以实现更好,更有效的传输. 在这篇文章中,我将讨论Apache Avro,这是一种开源数据序列化系统,Spark,Kafka等工具正在使用该工具进行 ...
最新文章
- 绿米空调伴侣接入iobroker_让普通空调听话又聪明 绿米Aqara空调伴侣小体验
- restful-api最佳实践
- 测试DeltaCopy
- python 获取html js 变量_Python爬虫与反反爬虫实践
- Boost:宏BOOST_NO_RTTI的使用实例
- Android -- Webview自适应屏幕
- 网络编程知识预备(4) ——了解应用层的HTTP协议与HTTPS协议
- Java8————方法引用
- 逗比学树莓派之GPIO
- java文件下载用什么技术_Java中实现文件上传下载的三种解决方案(推荐)
- CICD详解(一)——概念和原理
- coolpad大神f2Android,酷派大神F2全高清版(8675-FHD Android 5.0)刷Recovery教程
- [乐意黎原创] 送李愿归盘谷序
- 使用python来完成数据的线性拟合
- 程序员工作三年晒出工资条,直言加班太累了,网友评论炸锅
- 如何安装最新版本的office(preview预览版)、更新
- 生活杂谈-简单电器维修知识
- 微信小程序不能下拉刷新
- 如何解决ARP欺骗攻击
- 海伦公式的证明——杨子曰数学