跟老齐学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实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
Python常用算法学习基础教程
Apr 13 Python
python paramiko模块学习分享
Aug 23 Python
python 定时修改数据库的示例代码
Apr 08 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
python图像和办公文档处理总结
May 28 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
Python unittest discover批量执行代码实例
Sep 08 Python
python statsmodel的使用
Dec 21 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 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中define用法实例
2015/07/30 PHP
php计算年龄精准到年月日
2015/11/17 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
javascript实现日历效果
2019/06/17 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
python输出指定月份日历的方法
2015/04/23 Python
Python脚本实现虾米网签到功能
2016/04/12 Python
pyhton列表转换为数组的实例
2018/04/04 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
Python OpenCV中的resize()函数的使用
2019/06/20 Python
pyqt5中动画的使用详解
2020/04/01 Python
python 用struct模块解决黏包问题
2020/11/07 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
企业挂职心得体会
2014/09/10 职场文书
检讨书范文2000字
2015/01/28 职场文书
大学生入党群众意见书
2015/06/02 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript