python下函数参数的传递(参数带星号的说明)


Posted in Python onSeptember 19, 2010

函数参数的使用又有俩个方面值得注意:
1.函数参数是如何定义的
2.在调用函数的过程中参数是如何被解析

先看第一个问题,在python中函数参数的定义主要有四种方式:
1.F(arg1,arg2,...)
这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例 如:
def a(x,y):
print x,y
调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错。

2.F(arg1,arg2=value2,...)
这种方式就是第一种的改进版,提供了默认值
def a(x,y=3):
print x,y
调用该函数,a(1,2)同样还是x取1,y取2,但是如果a(1),则不会报错了,这个时候x还是1,y则为默认的3。上面这俩种方式,还可以更换参数位置,比如a(y=8,x=3)用这种形式也是可以的。

3.F(*arg1)
上 面俩个方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,它以一个*加上形参名的方式来表示这个函数 的实参个数不定,可能为0个也可能为n个。注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的tuple中。
>>> def a(*x):
if len(x)==0:
print 'None'
else:
print x
>>> a(1)
(1,) #存放在元组中
>>> a()
None
>>> a(1,2,3)
(1, 2, 3)
>>> a(m=1,y=2,z=3)

Traceback (most recent call last):
File "<pyshell#16>", line 1, in -toplevel-
a(m=1,y=2,z=3)
TypeError: a() got an unexpected keyword argument 'm'

4.F(**arg1)
形参名前加俩个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中,这时调用函数的方法则需要采用arg1=value1,arg2=value2这样的形式。
>>> def a(**x):
if len(x)==0:
print 'None'
else:
print x
>>> a()
None
>>> a(x=1,y=2)
{'y': 2, 'x': 1} #存放在字典中
>>> a(1,2) #这种调用则报错

Traceback (most recent call last):
File "<pyshell#25>", line 1, in -toplevel-
a(1,2)
TypeError: a() takes exactly 0 arguments (2 given)

上面介绍了四种定义方式,接下来看函数参数在调用过程中是怎么被解析的,其实只要记住上面这四种方法优先级依次降低,先1,后2,再3,最后4,也就是先把方式1中的arg解析,然后解析方式2中的arg=value,再解析方式3,即是把多出来的arg这种形式的实参组成个tuple传进去,最后把剩下的key=value这种形式的实参组成一个dictionary传给带俩个星号的形参,也就方式4。
>>> def test(x,y=1,*a,**b):
print x,y,a,b

>>> test(1)
1 1 () {}
>>> test(1,2)
1 2 () {}
>>> test(1,2,3)
1 2 (3,) {}
>>> test(1,2,3,4)
1 2 (3, 4) {}
>>> test(x=1,y=2)
1 2 () {}
>>> test(1,a=2)
1 1 () {'a': 2}
>>> test(1,2,3,a=4)
1 2 (3,) {'a': 4}
>>> test(1,2,3,y=4)

Traceback (most recent call last):
File "<pyshell#52>", line 1, in -toplevel-
test(1,2,3,y=4)
TypeError: test() got multiple values for keyword argument 'y'

Python 相关文章推荐
Python 命令行非阻塞输入的小例子
Sep 27 Python
通过Python实现自动填写调查问卷
Sep 06 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
详解pandas的外部数据导入与常用方法
May 01 Python
python实现QQ批量登录功能
Jun 19 Python
Python统计时间内的并发数代码实例
Dec 28 Python
pytorch之ImageFolder使用详解
Jan 06 Python
python实现图片横向和纵向拼接
Mar 05 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
Python实现弹球小游戏
Aug 01 Python
python map比for循环快在哪
Sep 21 Python
python线程优先级队列知识点总结
Feb 28 Python
Python 元类使用说明
Dec 18 #Python
Python3 入门教程 简单但比较不错
Nov 29 #Python
Python2.5/2.6实用教程 入门基础篇
Nov 29 #Python
python 快速排序代码
Nov 23 #Python
python 文件和路径操作函数小结
Nov 23 #Python
Python+Django在windows下的开发环境配置图解
Nov 11 #Python
Python 开发Activex组件方法
Nov 08 #Python
You might like
PHP empty函数报错解决办法
2014/03/06 PHP
php实现通过ftp上传文件
2015/06/19 PHP
php for 循环使用的简单实例
2016/06/02 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
jquery 手势密码插件
2017/03/17 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
2017/07/28 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
JS实现li标签的删除
2019/04/12 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
python使用百度翻译进行中翻英示例
2014/04/14 Python
Python实现发送email的几种常用方法
2014/08/18 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
应届硕士毕业生自荐信
2014/05/26 职场文书
党员个人承诺书
2015/04/27 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL
Python如何用re模块实现简易tokenizer
2022/05/02 Python