跟老齐学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 strip lstrip rstrip使用方法
Sep 06 Python
Python的subprocess模块总结
Nov 07 Python
python判断图片宽度和高度后删除图片的方法
May 22 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
python reverse反转部分数组的实例
Dec 13 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
Django如何开发简单的查询接口详解
May 17 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
python数据预处理方式 :数据降维
Feb 24 Python
浅谈Python 函数式编程
Jun 20 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 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使用者状态管理功能的应用
2006/10/09 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
php动态生成函数示例
2014/03/21 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
Python中使用dom模块生成XML文件示例
2015/04/05 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
python实现简易云音乐播放器
2018/01/04 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
工厂门卫的岗位职责
2014/07/27 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
捐款通知怎么写
2015/04/24 职场文书
文明礼仪倡议书
2015/04/28 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB