跟老齐学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简单计算文件夹大小的方法
Jul 14 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
用Python实现KNN分类算法
Dec 22 Python
Python模块搜索路径代码详解
Jan 29 Python
Python中的Django基本命令实例详解
Jul 15 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
实例详解Python装饰器与闭包
Jul 29 Python
学习和使用python的13个理由
Jul 30 Python
matlab中imadjust函数的作用及应用举例
Feb 27 Python
python 三种方法提取pdf中的图片
Feb 07 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生成WAP页面
2006/10/09 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
input框中的name和id的区别
2016/11/16 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
react-router实现按需加载
2017/05/09 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
Django 生成登陆验证码代码分享
2017/12/12 Python
Django开发的简易留言板案例详解
2018/12/04 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
Django REST framwork的权限验证实例
2020/04/02 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
Linux上比较文件的命令都有哪些
2012/02/24 面试题
《诺贝尔》教学反思
2014/02/17 职场文书
预备党员的自我评价
2014/03/12 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle
python中mongodb包操作数据库
2022/04/19 Python