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 相关文章推荐
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
利用Python读取文件的四种不同方法比对
May 18 Python
利用Python进行异常值分析实例代码
Dec 07 Python
Python检测网络延迟的代码
May 15 Python
详解Django rest_framework实现RESTful API
May 24 Python
Python学习小技巧总结
Jun 10 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
python DataFrame 取差集实例
Jan 30 Python
python 实现selenium断言和验证的方法
Feb 13 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 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
一个PHP操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
angular4自定义表单控件[(ngModel)]的实现
2018/11/23 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
益模软件Java笔试题
2012/03/27 面试题
家居饰品店创业计划书
2014/01/31 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书