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通过shutil实现快速文件复制的方法
Mar 14 Python
在Python中用has_key()方法查找键是否存在的教程
May 21 Python
探究python中open函数的使用
Mar 01 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
详解python中init方法和随机数方法
Mar 13 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
python多线程同步实例教程
Aug 11 Python
Django获取该数据的上一条和下一条方法
Aug 12 Python
Python实现智慧校园自动评教全新版
Jun 18 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 函数使用方法与函数定义方法
2010/05/09 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
php intval函数用法总结
2019/04/14 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
ES6的新特性概览
2016/03/10 Javascript
babel基本使用详解
2017/02/17 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
python服务器端收发请求的实现代码
2014/09/29 Python
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
Python中的引用知识点总结
2019/05/20 Python
python中eval与int的区别浅析
2019/08/11 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
python编写猜数字小游戏
2019/10/06 Python
pygame实现飞机大战
2020/03/11 Python
python中如何进行连乘计算
2020/05/28 Python
python和php哪个容易学
2020/06/19 Python
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
客服服务心得体会
2013/12/30 职场文书
消防工作实施方案
2014/06/09 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
优秀护士事迹材料
2014/12/25 职场文书
保送生自荐信
2015/03/06 职场文书
小学教师工作总结2015
2015/04/07 职场文书
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python