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 相关文章推荐
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
python绘制地震散点图
Jun 18 Python
Python变量访问权限控制详解
Jun 29 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
django使用JWT保存用户登录信息
Apr 22 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
python入门教程之基本算术运算符
Nov 13 Python
python tkinter实现连连看游戏
Nov 16 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实现的替换敏感字符串类实例
2014/09/22 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
PHP使用函数用法详解
2018/09/30 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
用Python编程实现语音控制电脑
2014/04/01 Python
Python输入二维数组方法
2018/04/13 Python
对python3新增的byte类型详解
2018/12/04 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Django实现文件上传下载
2019/10/06 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
python接入支付宝的实例操作
2020/07/20 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
什么是TCP/IP
2014/07/27 面试题
电大本科自我鉴定
2014/02/05 职场文书
个人承诺书怎么写
2014/05/24 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
老龙头导游词
2015/02/11 职场文书
人代会简报
2015/07/21 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
JUnit5常用注解的使用
2021/07/02 Java/Android
python实现局部图像放大
2021/11/17 Python