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基于贪心算法解决背包问题示例
Nov 27 Python
Django实战之用户认证(初始配置)
Jul 16 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
python处理multipart/form-data的请求方法
Dec 26 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
python字典的setdefault的巧妙用法
Aug 07 Python
python3实现微型的web服务器
Sep 03 Python
python绘制规则网络图形实例
Dec 09 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 Python
利用python清除移动硬盘中的临时文件
Oct 28 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 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
php生成静态文件的多种方法分享
2012/07/17 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
php使用正则验证中文
2016/04/06 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
js 通用订单代码
2013/12/23 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
详解redux异步操作实践
2018/08/15 Javascript
jQuery实现表格隔行换色
2018/09/01 jQuery
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
python实现从ftp服务器下载文件
2020/03/03 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Django静态文件加载失败解决方案
2020/08/26 Python
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
Linux Interview Questions For software testers
2013/05/17 面试题
领导的自我鉴定
2013/12/28 职场文书
完整版商业计划书
2014/09/15 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
java项目构建Gradle的使用教程
2022/03/24 Java/Android
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js