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字符串处理之count()方法的使用
May 18 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
python如何实现excel数据添加到mongodb
Jul 30 Python
Python实现图片滑动式验证识别方法
Nov 09 Python
tensorflow识别自己手写数字
Mar 14 Python
对python3 urllib包与http包的使用详解
May 10 Python
python flask安装和命令详解
Apr 02 Python
Python Numpy计算各类距离的方法
Jul 05 Python
python+pygame实现坦克大战
Sep 10 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
人工智能深度学习OpenAI baselines的使用方法
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
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python中的代码编码格式转换问题
2015/06/10 Python
python实现逻辑回归的方法示例
2017/05/02 Python
python实现求最长回文子串长度
2018/01/22 Python
Django 使用logging打印日志的实例
2018/04/28 Python
python爬取网易云音乐评论
2018/11/16 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
python实现XML解析的方法解析
2019/11/16 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
质检员工作总结2015
2015/04/25 职场文书
2015年话务员工作总结
2015/04/29 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
商业计划书之服装
2019/09/09 职场文书
pandas进行数据输入和输出的方法详解
2022/03/23 Python