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 相关文章推荐
用yum安装MySQLdb模块的步骤方法
Dec 15 Python
Python 转义字符详细介绍
Mar 21 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
python基础教程项目四之新闻聚合
Apr 02 Python
python: 判断tuple、list、dict是否为空的方法
Oct 22 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 Python
Python的控制结构之For、While、If循环问题
Jun 30 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无限极分类的案例教程
2016/05/09 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
js技巧--转义符"\"的妙用
2007/01/09 Javascript
javascript 面向对象编程基础 多态
2009/08/21 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
Python的subprocess模块总结
2014/11/07 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
Python如何计算语句执行时间
2019/11/22 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
趣味活动策划方案
2014/02/08 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
爱国主义主题班会
2015/08/14 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers
JavaScript流程控制(循环)
2021/12/06 Javascript
Python实现猜拳与猜数字游戏的方法详解
2022/04/06 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python