python中函数传递参数有四种形式

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

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

第一种 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),但四种方式混用时要遵守:

  • args = 须在args之后
  • *args须在args=value之后
  • **kargs须在*args之后

赋值过程为:

  1. 按顺序把传给args的实参赋值给对应的行参
  2. args = value 形式的实参赋值给行参
  3. 将多余出的即键值对行后的零散实参打包组成一个tuple传递给*args
  4. 将多余的key=value形式的实参打包正一个dicrionary传递给**kargs
举例

定义

def test(x,y=5,*,**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}

最新文章

  1. 6、ASP.NET MVC入门到精通——ASP.Net的两种开发方式
  2. 轻松搞懂WebService工作原理
  3. 用webview打开网页时,里面有个div带滚动条的,但是在平板上滚动条失效
  4. win7共享文件夹给局域网
  5. Java 集合类型
  6. MVC 中DropDownList 用法
  7. 从word中提取图片的三种方法
  8. web.xml配置详解之欢迎页面和错误页面
  9. MacOS快捷键
  10. BAT清理垃圾
  11. 初学Pexpect
  12. elasticsearch 修改内存
  13. Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合
  14. Go语言 切片长度和容量
  15. Linux桌面系统常用软件和笔记(更新)
  16. K3精益版给物料添加属性,并在BOM中新增字段引用该属性
  17. Go pprof性能监控
  18. foreach 引发的值类型与引用类型思考
  19. Luogu P3366 【模板】最小生成树
  20. js 相对路径转为绝对路径

热门文章

  1. python 切片&迭代
  2. Android Studio添加取消代码注释快捷键
  3. NFS-heartbeat-drbd模拟NFS高可用
  4. 一个较复杂的执行redis的lue脚本
  5. January 14 2017 Week 2nd Saturday
  6. Entity Framework: 主从表的增删改
  7. 一些通过SAP ABAP代码审查得出的ABAP编程最佳实践
  8. SAP Cloud for Customer Account和individual customer的区别
  9. JavaScript的DOM_操作表格
  10. 打印出类所在的jar包