为什么Python函数签名不包括返回参数?
在C/C++中,当我们定义一个函数时,除了要说明这个函数可以接受哪些参数,我们还需要强调它的返回类型,也就是这个函数会返回什么类型的结果。
而在Python中,一个函数可以选择返回一个值,也可以什么都不返回(返回None)。不过,在Python中,函数的定义只需要列出它可以接受的参数,不需要提到返回值的类型。
那么在Python中,我们应该如何理解这一点呢?
1 个回答
Python 不使用静态类型。
在 C++ 中,函数的类型签名实际上是函数名称的一部分;如果你调用 foo(2)
和 foo("wow")
,你实际上是在调用两个不同的函数。
而在 Python 中,某个特定的函数就是一个函数对象。如果你有对它的引用,你就可以调用它;你也可以用它的名字来查找,得到对它的引用。无论哪种方式,“类型签名”都不重要。
另外,在 C++ 中,如果你想重载一个函数,你需要多次声明它,每次用不同的类型签名;而在 Python 中,你只需要声明一次,但可以利用“鸭子类型”来让它根据不同的参数做出正确的处理。下面是一个例子:
// C++
int add2(int a, int b)
{
return a + b;
}
int add2(char const *a, int b)
{
return atoi(a) + b;
}
int add2(int a, char const *b)
{
return a + atoi(b);
}
int add2(char const *a, char const *b)
{
return atoi(a) + atoi(b);
}
# Python
def add2(a, b):
return int(a) + int(b)
根据上面的声明,在 Python 和 C 中,你都可以用任何组合的整数值和/或字符串来调用 add2()
函数。(我没有对字符串进行错误处理,但只要你传入合理的字符串,比如 "3"
,C++ 代码会正常工作。)区别在于,在 C++ 中你需要使用类型来声明多个版本的函数,并根据需要转换参数;而在 Python 中,你可以把任何东西作为 a
或 b
传入,调用 int()
会尝试把传入的值转换成 int
类型。
这个单一的 Python 函数会将任何可以转换为 int
类型的两个值相加。它可以处理像 "3"
这样的字符串,像 3.1415
这样的浮点数,布尔值(True
转换为 1
,False
转换为 0
)等等。当你传入 int
值时,调用 int()
只是返回原值;否则,int()
会强制转换为 int
类型,如果转换失败就会抛出异常。
这就是 Python 更方便的一个例子,你可以用几行代码完成很多工作。(当然,Python 的运行速度比 C++ 慢,所以 Python 不适合某些应用。)