Python函数参数定义及传递方式解析


Posted in Python onJune 10, 2020

python中函数定义参数有四种形式:

def fun1(a,b,c):
  pass
def fun2(a=1,b=2,c=3):
  pass
def fun3(*args):
  pass
def fun4(**kargs):
  pass

四种中最常见是前两种,基本上一般点的教程都会涉及,后两种一般很少单独出现,常用在混合模式中

第一种 fun1(a,b,c)是直接将实参赋予形参,根据位置做匹配,即严格要求实参的数量与行参的数量位置相等,比较一般,大多数语言常用这种方式。

第二种 fun2(a=1,b=2,c=3)根据键值对的形式做实参与形参的匹配,通过这种式就可以忽略了参数的位置关系,直接根据关键字来进行赋值,同时该种传参方式还有个好处就是可以在调用函数的时候作为个别选填项,不要求数量上的相等,即可以fun5(3,4)来调用fun2函数,这里关键就是前面的3,4覆盖了原来a、b两个形参的值,但c还是不变采用原来的默认值3,这种模式相较第一种更加灵活,不仅可以通过fun6(c=5,a=2,b=7)来打乱行参的位置,而且可以在没有对应形参传递的时候使用定义函数时的默认值。

第三种 fun3(*args) ,这定义方式在传参时是可以传入任意个参数,这些若干参数都被放到了tuple元组中赋值给行参args,之后要在函数中使用这些行参,直接操作args这个tuple元组就可以了,这样的好处是在参数的数量上没有了限制,但是因为是tuple,其本身还是有次序的,这就仍然存在一定的束缚,在对参数操作上也会有一些不便

第四种 fun4(**kargs)最为灵活,其是以键值对字典的形式向函数传参,含有第二种位置的灵活的同时具有第三种方式的数量上的无限制。此外第三四种函数声明的方式前的'*',与c里面的指针声明一样,这里仅做声明标识之用

最后要强调的是四种定义和传递方式混合使用(大多数情况是这种),fun7(a,b,c,**d),但四种方式混用时要遵守:定义和传递时,*kargs必须在*args之后

混合使用时的赋值过程为:

1、先根据前两种形式定义的函数,按顺序把实参赋值给对应的形参;

2、将多余出非键值对实参打包组成一个tuple传递给*args;

3、将多余的key=value形式的实参打包正一个dicrionary传递给**kargs

举例

def test(x,y=5,*a,**b):
  print x,y,a,b
#调用结果:
test(1) ===> 1 5 () {}
test(1,2) ===> 1 2 () {}
test(1,2,3) ===> 1 2 (3,) {}
test(1,2,3,4) ===> 1 2 (3,4)
test(x=1) ===> 1 5 () {}
test(x=1,y=1) ===> 1 1 () {}
test(x=1,y=1,a=1) ===> 1 1 () {'a':1} 
test(x=1,y=1,a=1,b=1) ===> 1 1 () {'a':1,'b':1}
test(1,y=1) ===> 1 1 () {}
test(1,2,y=1) ===> 出错,说y给赋了多个值
test(1,2,3,4,a=1) ===> 1 2 (3,4) {'a':1}
test(1,2,3,4,k=1,t=2,o=3) ===> 1 2 (3,4) {'k':1,'t':2,'o':3}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用paramiko模块实现ssh远程登陆上传文件并执行
Jan 27 Python
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 Python
Python3.2模拟实现webqq登录
Feb 15 Python
python如何获取服务器硬件信息
May 11 Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
python logging.info在终端没输出的解决
May 12 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
什么是python类属性
Jun 10 #Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 #Python
浅谈Python中的模块
Jun 10 #Python
keras多显卡训练方式
Jun 10 #Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 #Python
keras 多gpu并行运行案例
Jun 10 #Python
Keras自定义IOU方式
Jun 10 #Python
You might like
239军机修复记
2021/03/02 无线电
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
javascript实现下雨效果
2017/03/27 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
javascript的this关键字详解
2019/05/20 Javascript
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
对python3标准库httpclient的使用详解
2018/12/18 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
python框架flask表单实现详解
2019/11/04 Python
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
动态密码技术
2012/10/18 面试题
shell的种类有哪些
2015/04/15 面试题
临床医学专业学生的自我评价分享
2013/11/21 职场文书
优秀演讲稿范文
2013/12/29 职场文书
毕业生个人投资创业计划书
2014/01/04 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书