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两种遍历字典(dict)的方法比较
May 29 Python
python编码最佳实践之总结
Feb 14 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
Python笔记之facade模式
Nov 20 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
Python对wav文件的重采样实例
Feb 25 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 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 Sql Server连接失败问题及解决办法
2009/08/07 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
基于datagrid框架的查询
2013/04/08 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
JS实现随机点名器
2020/04/12 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
使用Python生成随机密码的示例分享
2016/02/18 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
pycharm 安装JPype的教程
2019/08/08 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
社区义诊活动总结
2014/04/30 职场文书
员工旷工检讨书
2015/08/15 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang