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通过future处理并发问题
Oct 17 Python
python实现电脑自动关机
Jun 20 Python
python使用turtle库绘制时钟
Mar 25 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
Python实现搜索算法的实例代码
Jan 02 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 Python
Python办公自动化之Excel(中)
May 24 Python
python入门学习关于for else的特殊特性讲解
Nov 20 Python
Elasticsearch 基本查询和组合查询
Apr 19 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
谈一谈收音机的高放电路
2021/03/02 无线电
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
浅析php数据类型转换
2014/01/09 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
PHP数组函数知识汇总
2016/05/12 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
Django教程笔记之中间件middleware详解
2018/08/01 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
餐厅筹备计划书
2014/04/25 职场文书
幸福家庭标语
2014/06/27 职场文书
技术入股合作协议书
2014/10/07 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
pytorch--之halfTensor的使用详解
2021/05/24 Python