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 算法 排序实现快速排序
Jun 05 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
浅谈flask源码之请求过程
Jul 26 Python
python实现二维数组的对角线遍历
Mar 02 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
python实现的自动发送消息功能详解
Aug 15 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
Pytorch之parameters的使用
Dec 31 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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
BBS(php & mysql)完整版(八)
2006/10/09 PHP
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
Javascript 学习笔记 错误处理
2009/07/30 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
js中indexof的用法详细解析
2013/12/24 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
了解重排与重绘
2019/05/29 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
数据库连接池的工作原理
2012/09/26 面试题
什么是GWT的Module
2013/01/20 面试题
大学生实习思想汇报
2014/01/12 职场文书
会计电算化专业求职信
2014/06/10 职场文书
社区元宵节活动总结
2015/02/06 职场文书
超市收银员岗位职责
2015/04/07 职场文书
教师节大会主持词
2015/07/06 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
python通过新建环境安装tfx的问题
2022/05/20 Python