跟老齐学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多线程抓取天涯帖子内容示例
Apr 03 Python
python自动化测试之setUp与tearDown实例
Sep 28 Python
在Python中使用dict和set方法的教程
Apr 27 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
pycharm重命名文件的方法步骤
Jul 29 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
为什么相对PHP黑python的更少
Jun 21 Python
浅析Python __name__ 是什么
Jul 07 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
Python数据结构之队列详解
Mar 21 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
SONY ICF-F10中波修复记
2021/03/02 无线电
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php接口技术实例详解
2016/12/07 PHP
网页自动跳转代码收集
2009/09/27 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
Saltstack快速入门简单汇总
2016/03/01 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
英国绿色商店:Natural Collection
2019/05/03 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
电子商务专业自荐信
2014/06/02 职场文书
军训拉歌口号
2014/06/13 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
Python字典的基础操作
2021/11/01 Python
Rust中的Struct使用示例详解
2022/08/14 Javascript