python进阶教程之函数参数的多种传递方法


Posted in Python onAugust 30, 2014

我们已经接触过函数(function)的参数(arguments)传递。当时我们根据位置,传递对应的参数。我们将接触更多的参数传递方式。

回忆一下位置传递:

def f(a,b,c):

    return a+b+c
print(f(1,2,3))

在调用f时,1,2,3根据位置分别传递给了a,b,c。

关键字传递

有些情况下,用位置传递会感觉比较死板。关键字(keyword)传递是根据每个参数的名字传递参数。关键字并不用遵守位置的对应关系。依然沿用上面f的定义,更改调用方式:

print(f(c=3,b=2,a=1))

关键字传递可以和位置传递混用。但位置参数要出现在关键字参数之前:

print(f(1,c=3,b=2))

参数默认值

在定义函数的时候,使用形如a=19的方式,可以给参数赋予默认值(default)。如果该参数最终没有被传递值,将使用该默认值。

def f(a,b,c=10):

    return a+b+c
print(f(3,2))

print(f(3,2,1))

在第一次调用函数f时, 我们并没有足够的值,c没有被赋值,c将使用默认值10.

第二次调用函数的时候,c被赋值为1,不再使用默认值。

包裹传递

在定义函数时,我们有时候并不知道调用的时候会传递多少个参数。这时候,包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会非常有用。

下面是包裹位置传递的例子:

def func(*name):

    print type(name)

    print name
func(1,4,6)

func(5,6,7,1,2,3)

两次调用,尽管参数个数不同,都基于同一个func定义。在func的参数表中,所有的参数被name收集,根据位置合并成一个元组(tuple),这就是包裹位置传递。

为了提醒Python参数,name是包裹位置传递所用的元组名,在定义func时,在name前加*号。

下面是包裹关键字传递的例子:

def func(**dict):

    print type(dict)

    print dict
func(a=1,b=9)

func(m=2,n=1,c=11)

与上面一个例子类似,dict是一个字典,收集所有的关键字,传递给函数func。为了提醒Python,参数dict是包裹关键字传递所用的字典,在dict前加**。

包裹传递的关键在于定义函数时,在相应元组或字典前加*或**。

解包裹

*和**,也可以在调用的时候使用,即解包裹(unpacking), 下面为例:

def func(a,b,c):

    print a,b,c
args = (1,3,4)

func(*args)

在这个例子中,所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。在调用func时使用*,是为了提醒Python:我想要把args拆成分散的三个元素,分别传递给a,b,c。(设想一下在调用func时,args前面没有*会是什么后果?)

相应的,也存在对词典的解包裹,使用相同的func定义,然后:

dict = {'a':1,'b':2,'c':3}

func(**dict)

在传递词典dict时,让词典的每个键值对作为一个关键字传递给func。
 
混合

在定义或者调用参数时,参数的几种传递方式可以混合。但在过程中要小心前后顺序。基本原则是,先位置,再关键字,再包裹位置,再包裹关键字,并且根据上面所说的原理细细分辨。

注意:请注意定义时和调用时的区分。包裹和解包裹并不是相反操作,是两个相对独立的过程。

总结

关键字,默认值,

包裹位置,包裹关键字

解包裹

Python 相关文章推荐
Python实现对PPT文件进行截图操作的方法
Apr 28 Python
python中随机函数random用法实例
Apr 30 Python
深入理解Python中变量赋值的问题
Jan 12 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
Python列表list常用内建函数实例小结
Oct 22 Python
python 中不同包 类 方法 之间的调用详解
Mar 09 Python
Python requests模块session代码实例
Apr 14 Python
Keras-多输入多输出实例(多任务)
Jun 22 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
Python APScheduler执行使用方法详解
Dec 10 Python
python进阶教程之模块(module)介绍
Aug 30 #Python
Python中的闭包实例详解
Aug 29 #Python
python进阶教程之文本文件的读取和写入
Aug 29 #Python
Python中__call__用法实例
Aug 29 #Python
python进阶教程之词典、字典、dict
Aug 29 #Python
python字符串排序方法
Aug 29 #Python
python基础教程之对象和类的实际运用
Aug 29 #Python
You might like
如何过滤高亮显示非法字符
2006/10/09 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
jQuery函数的等价原生函数代码示例
2013/05/27 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
利用Python批量生成任意尺寸的图片
2016/08/29 Python
Python用UUID库生成唯一ID的方法示例
2016/12/15 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
python实现手势识别的示例(入门)
2020/04/15 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
空指针到底是什么
2012/08/07 面试题
事业单位请假制度
2014/01/13 职场文书
珍惜水资源建议书
2014/03/12 职场文书
对教师的评语
2014/04/28 职场文书
反邪教标语
2014/06/23 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
优秀班集体申报材料
2014/12/25 职场文书
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang