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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
Python实现获取操作系统版本信息方法
Apr 08 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
对numpy中轴与维度的理解
Apr 18 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
Python求均值,方差,标准差的实例
Jun 29 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 Python
如何理解Python中包的引入
May 29 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
Python3爬虫关于代理池的维护详解
Jul 30 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 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
在php和MySql中计算时间差的方法
2011/04/22 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
python中二维阵列的变换实例
2014/10/09 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
python对execl 处理操作代码
2020/06/22 Python
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
旅游管理本科生求职信
2013/10/14 职场文书
高一生物教学反思
2014/01/17 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
慰问信格式规范
2015/03/23 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书