这是我对这一切的看法,我还将尝试解释为什么我认为接受的答案大多是不正确的。
首先programming functions != mathematical functions。最接近数学函数的方法是进行函数式编程,但即便如此,也有很多例子表明并非如此。
- 函数不必必须有输入
- 函数不必必须有输出
- 函数不必将输入映射到输出(因为前面两个要点)
就编程而言,函数可以简单地视为一块内存,具有开始(函数的入口点)、主体(空或其他)和出口点(一个或多个,具体取决于实现)这些是为了重用您编写的代码。即使你没有看到它,一个函数也总是“返回”一些东西。这实际上是函数调用之后下一条语句的地址。如果您使用汇编语言进行一些非常低级的编程,您将看到它的全部荣耀(我敢于让您加倍努力,像 Linus Torvalds 那样手动编写一些机器代码,他在他的研讨会和采访:D)。此外,您还可以获取一些输入并吐出一些输出。这就是为什么
def foo():
pass
是一段完全正确的代码。
那么为什么返回多种类型是不好的呢?嗯......除非你滥用它,否则它根本不是。这当然是编程技能差和/或不知道您使用的语言可以做什么的问题。
返回 None 然后创建一个新的空元组会不会更节省内存,或者这个时间差是否太小以至于即使在较大的项目中也无法注意到?
据我所知 - 是的,返回 NoneType 对象在内存方面会便宜得多。这是一个小实验(返回值是字节):
>> sys.getsizeof(None)
16
>> sys.getsizeof(())
48
根据您用作返回值的对象类型(数字类型、列表、字典、元组等),Python 以不同的方式管理内存,包括最初保留的存储。
但是,您还必须考虑函数调用周围的代码以及它如何处理函数返回的任何内容。你检查NoneType吗?或者您只是检查返回的元组的长度是否为 0?返回值及其类型的这种传播(NoneType 与您的情况下的空元组)实际上可能更繁琐处理和炸毁在您的脸上。不要忘记 - 代码本身已加载到内存中,因此如果处理 NoneType 需要太多代码(即使是少量代码,但数量很大)最好保留空元组,这也可以避免混淆人们使用你的函数却忘记了它实际上返回了两种类型的值。
说到返回多种类型的值,这是我同意接受的答案的部分(但只是部分) - 返回单一类型无疑会使代码更易于维护。只检查类型 A 然后检查 A、B、C 等要容易得多。
然而,Python 是一种面向对象的语言,因此继承、抽象类等以及作为整个 OOP 恶作剧一部分的所有内容都会发挥作用。它甚至可以即时生成类,这是我几个月前发现的,当时我惊呆了(在 C/C++ 中从未见过这种东西)。
旁注:您可以在this nice overview article 中阅读一些关于元类和动态类的信息,其中包含大量示例。
事实上,如果没有所谓的多态函数,甚至不存在多种设计模式和技术。下面我给你两个非常热门的话题(找不到更好的方法来用一个词来概括两者):
最后,你的函数是返回一种还是多种类型完全取决于你要解决的问题。这种多态行为可以被滥用吗?当然,就像其他一切一样。