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中处理字符串之ljust()方法的使用简介
May 19 Python
在Django的上下文中设置变量的方法
Jul 20 Python
PyQt5每天必学之布局管理
Apr 19 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
Apr 21 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
PyCharm第一次安装及使用教程
Jan 08 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
Python如何读写字节数据
Aug 05 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和ASP.NET的10大对比!
2015/12/24 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
Prototype Date对象 学习
2009/07/12 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
Pyramid添加Middleware的方法实例
2013/11/27 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
Python itertools.product方法代码实例
2020/03/27 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
追悼会子女答谢词
2014/01/28 职场文书
班班通项目实施方案
2014/02/25 职场文书
生物制药专业求职信
2014/03/11 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
女方离婚起诉书
2015/05/18 职场文书