Python中函数的参数定义和可变参数用法实例分析


Posted in Python onJune 04, 2015

本文实例讲述了Python中函数的参数定义和可变参数用法。分享给大家供大家参考。具体如下:

刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解。其实只要把函数参数定义搞清楚了,就不难理解了。

先说说函数定义,我们都知道,下面的代码定义了一个函数funcA

def funcA():
 pass

显然,函数funcA没有参数(同时啥也不干:D)。

下面这个函数funcB就有两个参数了,

def funcB(a, b):
 print a
 print b

调用的时候,我们需要使用函数名,加上圆括号扩起来的参数列表,比如 funcB(100, 99),执行结果是:

100
99

很明显,参数的顺序和个数要和函数定义中一致,如果执行funcB(100),Python会报错的:

TypeError: funcB() takes exactly 2 arguments (1 given)

我们可以在函数定义中使用参数默认值,比如

def funcC(a, b=0):
 print a
 print b

在函数funcC的定义中,参数b有默认值,是一个可选参数,如果我们调用funcC(100),b会自动赋值为0。

OK,目前为止,我们要定义一个函数的时候,必须要预先定义这个函数需要多少个参数(或者说可以接受多少个参数)。一般情况下这是没问题的,但是也有在定义函数的时候,不能知道参数个数的情况(想一想C语言里的printf函数),在Python里,带*的参数就是用来接受可变数量参数的。看一个例子

def funcD(a, b, *c):
 print a
 print b
 print "length of c is: %d " % len(c)
 print c

调用funcD(1, 2, 3, 4, 5, 6)结果是

1
2
length of c is: 4
(3, 4, 5, 6)

我们看到,前面两个参数被a、b接受了,剩下的4个参数,全部被c接受了,c在这里是一个tuple。我们在调用funcD的时候,至少要传递2个参数,2个以上的参数,都放到c里了,如果只有两个参数,那么c就是一个empty tuple。

好了,一颗星我们弄清楚了,下面轮到两颗星。

上面的例子里,调用函数的时候,传递的参数都是根据位置来跟函数定义里的参数表匹配的,比如funcB(100, 99)和funcB(99, 100)的执行结果是不一样的。在Python里,还支持一种用关键字参数(keyword argument)调用函数的办法,也就是在调用函数的时候,明确指定参数值付给那个形参。比如还是上面的funcB(a, b),我们通过这两种方式调用
funcB(a=100, b=99)

funcB(b=99, a=100)

结果跟funcB(100, 99)都是一样的,因为我们在使用关键字参数调用的时候,指定了把100赋值给a,99赋值给b。也就是说,关键字参数可以让我们在调用函数的时候打乱参数传递的顺序!

另外,在函数调用中,可以混合使用基于位置匹配的参数和关键字参数,前题是先给出固定位置的参数,比如

def funcE(a, b, c):
 print a
 print b
 print c

调用funcE(100, 99, 98)和调用funcE(100, c=98, b=99)的结果是一样的。

好了,经过以上铺垫,两颗星总算可以出场了:
如果一个函数定义中的最后一个形参有 ** (双星号)前缀,所有正常形参之外的其他的关键字参数都将被放置在一个字典中传递给函数,比如:

def funcF(a, **b):
 print a
 for x in b:
  print x + ": " + str(b[x])

调用funcF(100, c='你好', b=200),执行结果

100
c: 你好
b: 200

大家可以看到,b是一个dict对象实例,它接受了关键字参数b和c。

常规参数,*参数及**参数可以同时使用,具体怎么用?看看Python Reference Manual吧,关于Function definitions的那些章节。其实,笨想也能猜出来啊,o(∩_∩)o...

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
讲解python参数和作用域的使用
Nov 01 Python
python实现探测socket和web服务示例
Mar 28 Python
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
python中的测试框架
Nov 13 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 Python
pip install命令安装扩展库整理
Mar 02 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
Python实现为PDF去除水印的示例代码
Apr 03 Python
python类装饰器用法实例
Jun 04 #Python
python获得一个月有多少天的方法
Jun 04 #Python
Python中threading模块join函数用法实例分析
Jun 04 #Python
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 #Python
python创建进程fork用法
Jun 04 #Python
Python文件及目录操作实例详解
Jun 04 #Python
Python通过poll实现异步IO的方法
Jun 04 #Python
You might like
web方式ftp
2006/10/09 PHP
深入分析php之面向对象
2013/05/15 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
jQuery中map函数的两种方式
2017/04/07 jQuery
js 只比较时间大小的实例
2017/10/26 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python写的贪吃蛇游戏例子
2014/06/16 Python
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
jupyter安装小结
2016/03/13 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
新闻记者实习自我鉴定
2013/09/19 职场文书
师范应届生求职信
2013/11/15 职场文书
优秀教师个人总结
2015/02/11 职场文书
保护动物的宣传语
2015/07/13 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
Python数据结构之队列详解
2022/03/21 Python
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python