跟老齐学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 相关文章推荐
Django框架中render_to_response()函数的使用方法
Jul 16 Python
python中set常用操作汇总
Jun 30 Python
python实现员工管理系统
Jan 11 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
python实现自动登录后台管理系统
Oct 18 Python
Python 实现微信防撤回功能
Apr 29 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
Python 线程池用法简单示例
Oct 02 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
Python机器学习之KNN近邻算法
May 14 Python
python实现学生信息管理系统(面向对象)
Jun 05 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 数组遍历顺序理解
2009/09/09 PHP
php修改时间格式的代码
2011/05/29 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
php实现等比例压缩图片
2018/07/26 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
Python管理Windows服务小脚本
2018/03/12 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
python实现按日期归档文件
2021/01/30 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
银河香水:Galaxy Perfume
2019/03/25 全球购物
北承题目(C++)
2012/05/16 面试题
销售工作岗位职责
2013/12/24 职场文书
教师一岗双责责任书
2014/04/16 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
2015年共青团工作总结
2015/05/15 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
2015中学教学工作总结
2015/07/22 职场文书
mysql sock 文件解析及作用讲解
2022/07/15 MySQL