跟老齐学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简单判断序列是否为空的方法
Jun 30 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
Django中的Signal代码详解
Feb 05 Python
JavaScript实现一维数组转化为二维数组
Apr 17 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
python中的colorlog库使用详解
Jul 05 Python
python中的global关键字的使用方法
Aug 20 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
Mar 19 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
Python数据分析之绘图和可视化详解
Jun 02 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微信公众平台开发(四)回复功能开发
2016/12/06 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Python常用列表数据结构小结
2014/08/06 Python
python常用函数详解
2016/09/13 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python制作填词游戏步骤详解
2019/05/05 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
python标记语句块使用方法总结
2019/08/05 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
python文件路径操作方法总结
2020/12/21 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
物流专业毕业生推荐信范文
2013/11/18 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
新法人代表任命书
2014/06/06 职场文书
营销学习心得体会
2014/09/12 职场文书
家长学校教学计划
2015/01/19 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
如何撰写促销方案?
2019/07/05 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
python获取淘宝服务器时间的代码示例
2021/04/22 Python