跟老齐学Python之总结参数的传递


Posted in Python onOctober 10, 2014

就前面所讲,函数的基本内容已经完毕。但是,函数还有很多值得不断玩味的细节。这里进行阐述。

参数的传递

python中函数的参数通过赋值的方式来传递引用对象。下面总结通过总结常见的函数参数定义方式,来理解参数传递的流程。

def foo(p1,p2,p3,...)

这种方式最常见了,列出有限个数的参数,并且彼此之间用逗号隔开。在调用函数的时候,按照顺序以此对参数进行赋值,特备注意的是,参数的名字不重要,重要的是位置。而且,必须数量一致,一一对应。第一个对象(可能是数值、字符串等等)对应第一个参数,第二个对应第二个参数,如此对应,不得偏左也不得偏右。

>>> def foo(p1,p2,p3):

...     print "p1==>",p1

...     print "p2==>",p2

...     print "p3==>",p3

... 

>>> foo("python",1,["qiwsir","github","io"])    #一一对应地赋值

p1==> python

p2==> 1

p3==> ['qiwsir', 'github', 'io']
>>> foo("python")

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: foo() takes exactly 3 arguments (1 given)    #注意看报错信息
>>> foo("python",1,2,3)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: foo() takes exactly 3 arguments (4 given)    #要求3个参数,实际上放置了4个,报错

 def foo(p1=value1,p2=value2,...)

这种方式比前面一种更明确某个参数的赋值,貌似这样就不乱子了,很明确呀。颇有一个萝卜对着一个坑的意味。

还是上面那个函数,用下面的方式赋值,就不用担心顺序问题了。

>>> foo(p3=3,p1=10,p2=222)

p1==> 10

p2==> 222

p3==> 3

 也可以采用下面的方式定义参数,给某些参数有默认的值

>>> def foo(p1,p2=22,p3=33):    #设置了两个参数p2,p3的默认值

...     print "p1==>",p1

...     print "p2==>",p2

...     print "p3==>",p3

... 

>>> foo(11)     #p1=11,其它的参数为默认赋值

p1==> 11

p2==> 22

p3==> 33

>>> foo(11,222)     #按照顺序,p2=222,p3依旧维持原默认值

p1==> 11

p2==> 222

p3==> 33

>>> foo(11,222,333)  #按顺序赋值

p1==> 11

p2==> 222

p3==> 333
>>> foo(11,p2=122)

p1==> 11

p2==> 122

p3==> 33
>>> foo(p2=122)     #p1没有默认值,必须要赋值的,否则报错

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: foo() takes at least 1 argument (1 given)

 def foo(*args)

这种方式适合于不确定参数个数的时候,在参数args前面加一个*,注意,仅一个哟。

>>> def foo(*args):         #接收不确定个数的数据对象

...     print args

... 

>>> foo("qiwsir.github.io") #以tuple形式接收到,哪怕是一个

('qiwsir.github.io',)

>>> foo("qiwsir.github.io","python")

('qiwsir.github.io', 'python')

 上一讲中已经有例子说明,可以和前面的混合使用。此处不赘述。

def foo(**args)

这种方式跟上面的区别在于,必须接收类似arg=val形式的。

>>> def foo(**args):    #这种方式接收,以dictionary的形式接收数据对象

...     print args

...
>>> foo(1,2,3)          #这样就报错了

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: foo() takes exactly 0 arguments (3 given)
>>> foo(a=1,b=2,c=3)    #这样就可以了,因为有了键值对

{'a': 1, 'c': 3, 'b': 2}

 下面来一个综合的,看看以上四种参数传递方法的执行顺序

>>> def foo(x,y=2,*targs,**dargs):

...     print "x==>",x

...     print "y==>",y

...     print "targs_tuple==>",targs

...     print "dargs_dict==>",dargs

...
>>> foo("1x")

x==> 1x

y==> 2

targs_tuple==> ()

dargs_dict==> {}
>>> foo("1x","2y")

x==> 1x

y==> 2y

targs_tuple==> ()

dargs_dict==> {}
>>> foo("1x","2y","3t1","3t2")

x==> 1x

y==> 2y

targs_tuple==> ('3t1', '3t2')

dargs_dict==> {}
>>> foo("1x","2y","3t1","3t2",d1="4d1",d2="4d2")

x==> 1x

y==> 2y

targs_tuple==> ('3t1', '3t2')

dargs_dict==> {'d2': '4d2', 'd1': '4d1'}

 通过上面的例子,看官是否看出什么名堂了呢?

Python 相关文章推荐
python中stdout输出不缓存的设置方法
May 29 Python
Python中的is和id用法分析
Jan 26 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
windows系统下Python环境搭建教程
Mar 28 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
跟老齐学Python之变量和参数
Oct 10 #Python
跟老齐学Python之重回函数
Oct 10 #Python
跟老齐学Python之Python文档
Oct 10 #Python
跟老齐学Python之大话题小函数(2)
Oct 10 #Python
跟老齐学Python之大话题小函数(1)
Oct 10 #Python
Python警察与小偷的实现之一客户端与服务端通信实例
Oct 09 #Python
python中二维阵列的变换实例
Oct 09 #Python
You might like
php购物车实现方法
2015/01/03 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
Javascript 错误处理的几种方法
2009/06/13 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
常用的 JS 排序算法 整理版
2018/04/05 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
js验证账户名是否重复
2020/05/26 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
jupyter lab文件导出/下载方式
2020/04/22 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
毕业生医学检验求职信
2013/10/16 职场文书
机电一体化职业规划书
2014/01/07 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
会计学自荐信
2014/06/03 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js