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中的*和**参数传递机制相关推荐

  1. python函数可选参数传递_Python中函数的参数传递

    1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> print add ...

  2. python命令行参数传递_Python中 命令行参数传递 与 处理

    英文原文: http://www.artima.com/weblogs/viewpost.jsp?thread=4829 很多人会在 if __name__ == "__main__&quo ...

  3. python有向图_Python 中的垃圾回收机制

    一.概述 python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略. 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的 ...

  4. 参数 中_Python中函数的参数传递

    Python中函数的参数传递 一.在函数的调用时,python解析器不会检查参数的类型,其中实参传递的可以是任意类型的对象(数值型.布尔型.字符串.列表.字典.元组甚至函数). 实例: 结果: 二.在 ...

  5. 简述python垃圾回收机制_python中的垃圾回收机制简述

    2020年12月5日21:47:35 王凯玉 python中的垃圾回收机制 引用计数 # 引用计数 引用计数是编程语言中的一中内存管理技术,可以将资源的被引用次数保存起来. 当引用计数为0时,资源将被 ...

  6. java 参数传递_java中方法的参数传递机制

    无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些.闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递. 这里的内存模型涉及到 ...

  7. python字符集_PYTHON 中的字符集

    Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...

  8. python参数化_Python 中如何实现参数化测试的方法示例

    之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest.nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架. 本文想针对测试中一种很常见的测试场景,即参 ...

  9. kafka python框架_Python中如何使用Apache Avro——Apache的数据序列化系统

    了解如何创建和使用基于Apache Avro的数据,以实现更好,更有效的传输. 在这篇文章中,我将讨论Apache Avro,这是一种开源数据序列化系统,Spark,Kafka等工具正在使用该工具进行 ...

最新文章

  1. 绿米空调伴侣接入iobroker_让普通空调听话又聪明 绿米Aqara空调伴侣小体验
  2. restful-api最佳实践
  3. 测试DeltaCopy
  4. python 获取html js 变量_Python爬虫与反反爬虫实践
  5. Boost:宏BOOST_NO_RTTI的使用实例
  6. Android -- Webview自适应屏幕
  7. 网络编程知识预备(4) ——了解应用层的HTTP协议与HTTPS协议
  8. Java8————方法引用
  9. 逗比学树莓派之GPIO
  10. java文件下载用什么技术_Java中实现文件上传下载的三种解决方案(推荐)
  11. CICD详解(一)——概念和原理
  12. coolpad大神f2Android,酷派大神F2全高清版(8675-FHD Android 5.0)刷Recovery教程
  13. [乐意黎原创] 送李愿归盘谷序
  14. 使用python来完成数据的线性拟合
  15. 程序员工作三年晒出工资条,直言加班太累了,网友评论炸锅
  16. 如何安装最新版本的office(preview预览版)、更新
  17. 生活杂谈-简单电器维修知识
  18. 微信小程序不能下拉刷新
  19. 如何解决ARP欺骗攻击
  20. 海伦公式的证明——杨子曰数学

热门文章

  1. Linux下gcc入门
  2. Python学习笔记:面向对象编程(3)
  3. 安卓服务Service详解
  4. Linux内存管理之一 分段与分页
  5. 二十万字C/C++、嵌入式软开面试题全集宝典五
  6. 计算天数java_Java,计算两个日期之间的天数
  7. caffe源码分析:blob.hpp分析
  8. [云炬创业基础笔记]第五章创业机会评估测试8
  9. [云炬ThinkPython阅读笔记]2.2 变量名
  10. wdpc配置https打不开