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 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
跟老齐学Python之玩转字符串(1)
Sep 14 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
python3使用SMTP发送简单文本邮件
Jun 19 Python
python实现朴素贝叶斯算法
Nov 19 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Python如何在循环内使用list.remove()
Jun 01 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
python 爬取B站原视频的实例代码
Sep 09 Python
Python面试不修改数组找出重复的数字
May 20 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
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
使用js写的一个简易的投票
2013/11/27 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
微信小程序页面生命周期详解
2018/01/31 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python读写Redis数据库操作示例
2014/03/18 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
用python找出那些被“标记”的照片
2017/04/20 Python
用python爬取租房网站信息的代码
2018/12/14 Python
python中树与树的表示知识点总结
2019/09/14 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
日语专业毕业生求职信
2013/12/04 职场文书
酒店总经理工作职责
2013/12/13 职场文书
学生不讲诚信检讨书
2014/09/29 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
医者仁心观后感
2015/06/17 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书