likes
comments
collection
share

python能否支持函数重载的问题

作者站长头像
站长
· 阅读数 2

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:



参数组

  • 我们还可以将一个元组或者字典, 作为参数组, 来传给函数. 这样就可以帮助我们实现 "可变长参数"
  • 通过将参数名前加一个 *号, *** 之后的内容表示是一个元组.**
def log(*msg):  #msg是一个元组
    for m in msg:
        print(m,end = ' ')  #以空格分隔打印的内容
log(10,20,30)
#执行结果
10 20 30 

思考: 为啥要用 \t 分割呢?

  • 使用 \t 分割的行文本, 可以很方便的和linux上的一些文本处理工具搭配使用. 比如cut, sort, awk等.
  • 通过在参数名前加两个星号 **, 星号后面的部分表示传入的参数是一个字典. 这时候调用函数就可以按照关键字参数的方式传参了
def log(**msg): #msg变成一个字典
    for m in msg:
        print(m,msg[m]) 
log(x= 10,y = 20, z= 30)
#执行结果
x 10
y 20
z 30

函数重载?->不支持

  • 如果Python中有两个相同名字的函数, 会出现什么样的效果呢?

后一个函数覆盖前一个函数

def Func():
    print('1')

def Func():
    print('2')
Func()

# 执行结果
2
  • 要记得, 函数也是对象. 代码中定义两个相同名字的函数, 这样的操作类似于
a = 1
a = 2
print(a)

相当于是对Func这个变量重新进行了绑定.


为什么不支持

我们知道, C++和Java中都有函数重载, 然而Python中并没有这个语法. 思考为什么?

  • 重载归根结底是为了同一个函数, 能够适应几种不同类型的输入数据.
  • 重载的关键词有两个: 不同参数类型; 不同参数数目.
  • Python的变量类型是在运行时检查的, 同一个函数, 就已经可以处理不同类型的参数了.
  • 通过参数组和默认参数, 解决处理不同数目的参数的能力.
  • 通过关键字参数, 也极大的加强了传参的灵活性, 而不比像C++那样只能按顺序传参.

综上, Python完全没有任何必要再去支持 "重载" 这样的语法了. 包括后续出现的一系列动态类型语言, 都不再支持重载

重载:

1.参数类型不同,python是动态类型,天然一个函数就可以传入不同类型

2.参数个数不同,python有默认参数和参数组的语法

所以python不需要支持重载 ,python参数规则功能强于重载


函数的返回值

  • 通过return关键字返回一个对象.
  • 如果没有return语句, 则返回的是None对象.
  • 可以同时返回N个对象, 通过,分割(本质上是在返回一个元组).
def Hello():
    print('hello')
print(Hello())  #如果没有return语句, 则返回的是None对象
# 执行结果
hello
None

函数的内置属性

内建函数dir

函数也是一个对象, 通过内建函数 dir 可以看到一个函数中都有哪些属性.

def Hello():
    print("Hello()")
print(dir(Hello))
#执行结果
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

\