跟老齐学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在校内发人人网状态(人人网看状态)
Feb 19 Python
python处理文本文件并生成指定格式的文件
Jul 31 Python
解析Python中while true的使用
Oct 13 Python
python读取二进制mnist实例详解
May 31 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
Python3最长回文子串算法示例
Mar 04 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
Feb 16 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
杏林同学录(六)
2006/10/09 PHP
SSI指令
2006/11/25 PHP
php 注册时输入信息验证器的实现详解
2013/07/05 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
js Calender控件使用详解
2015/01/05 Javascript
Jquery 实现图片轮换
2015/01/28 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
JS实现密码框效果
2020/09/10 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
python分析网页上所有超链接的方法
2015/05/08 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
某个公司的Java笔面试题
2016/03/11 面试题
办公室前台岗位职责范本
2013/12/10 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
九年级科学教学反思
2014/01/29 职场文书
项目投资意向书
2014/04/01 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP