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 中文乱码问题深入分析
Mar 13 Python
使用Python脚本来获取Cisco设备信息的示例
May 04 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
浅析Python中的多条件排序实现
Jun 07 Python
python实现搜索文本文件内容脚本
Jun 22 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
Python zip函数打包元素实例解析
Dec 11 Python
python列表推导和生成器表达式知识点总结
Jan 10 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 Python
Python log模块logging记录打印用法解析
Jan 20 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
使用Python解决图表与画布的间距问题
Apr 11 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准确取得服务器IP地址的方法
2015/06/02 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
文本链接逐个出现的js脚本
2007/12/12 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
python检测远程端口是否打开的方法
2015/03/14 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
通过cmd进入python的步骤
2020/06/16 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
编辑找工作求职信范文
2013/12/16 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
环保主题班会教案
2015/08/13 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
vue使用watch监听属性变化
2022/04/30 Vue.js
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs