跟老齐学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算法之图的遍历
Nov 16 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
Python基于property实现类的特性操作示例
Jun 15 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
Eclipse配置python默认头过程图解
Apr 26 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
浅谈Python数学建模之线性规划
Jun 23 Python
Python实现打乒乓小游戏
Sep 25 Python
Python matplotlib绘制雷达图
Apr 13 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
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
PHP7 弃用功能
2021/03/09 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
Less 安装及基本用法
2018/05/05 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
纽约海:Sea New York
2018/11/04 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
5.12护士节活动总结
2015/02/10 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python
Python测试框架pytest高阶用法全面详解
2022/06/01 Python