python 为什么没有重载_python 中为什么不需要重载

函数重载主要是为了解决两个问题。

(1)可变参数类型。

(2) 可变参数个数。

另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。

好吧,那么对于情况 (1),函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。

那么对于情况 (2),函数功能相同,但参数个数不同,python 如何处理?答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。

好了,鉴于情况 (1) 跟 情况 (2) 都有了解决方案,python 自然就不需要函数重载了。

这里顺便说一下python中参数传递时候的*arg和**args,看几个小栗子就一清二楚了:

第一个小栗子:

1 def test1(farg,*args):2 print ("farg:",farg)3 for value inargs:4 print ("args:",value)5

6 test1(1,"two",3,"4")

附上结果:

f5b76b5750efbc9a7cbe6dcff714493a.png

第二个小栗子:

1 def test2(farg,**args):2 print ("farg:",farg)3 for key inargs:4 print ("key:%s values:%s"%(key,args[key]))

结果:

bc9e845dbdde35a292aef66f62c0634a.png

下面的例子更加清晰,定义的时候 * 的作用 将位置实参 装配成元组,**的作用 将关键字实参 装配成字典

1 def test1(x, y, z, *args):2 print(x, y, z, args)3

4

5 def test2(x, y, z, **kwargs):6 print(x, y, z, kwargs)7

8

9 test1(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)10

11 test2(1, 2, 3, a=4, b=5)

28996f8722ede9ae4a9034a4d710bb7c.png

下面的例子是调用的时候 * 的作用将元组或列表 打散成位置参数进行参数传递,** 的作用将字典打散成关键字参数进行参数传递

下面

1 deftest3(x, y, z):2 print(x, y, z)3

4 x = [1, 2, 3]5 x1 = (‘q‘,‘w‘,‘e‘)6 y = {‘x‘: 1, ‘y‘: 2, ‘z‘: 3}7 test3(*x1)8 test3(*x)9 test3(**y)

460f1cf9a90641aaaedc819bb78bec1b.png

原文:http://www.cnblogs.com/erbaodabao0611/p/7490439.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值