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 相关文章推荐
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
在Python中使用SQLite的简单教程
Apr 29 Python
用Python计算三角函数之atan()方法的使用
May 15 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
详解Python之unittest单元测试代码
Jan 24 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
python如何绘制疫情图
Sep 16 Python
python 遍历磁盘目录的三种方法
Apr 02 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
python异步的ASGI与Fast Api实现
Jul 16 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
PHP异常处理Exception类
2015/12/11 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
使用python为mysql实现restful接口
2018/01/05 Python
python实现二维插值的三维显示
2018/12/17 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
前处理组长岗位职责
2014/03/01 职场文书
项目施工员岗位职责
2014/03/09 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
黄埔军校观后感
2015/06/10 职场文书
贫困证明书范文
2015/06/16 职场文书
学习心得体会
2019/06/20 职场文书
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android