为什么Python函数签名不包括返回参数?

2 投票
1 回答
969 浏览
提问于 2025-04-18 00:27

在C/C++中,当我们定义一个函数时,除了要说明这个函数可以接受哪些参数,我们还需要强调它的返回类型,也就是这个函数会返回什么类型的结果。

而在Python中,一个函数可以选择返回一个值,也可以什么都不返回(返回None)。不过,在Python中,函数的定义只需要列出它可以接受的参数,不需要提到返回值的类型。

那么在Python中,我们应该如何理解这一点呢?

1 个回答

3

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 中,你可以把任何东西作为 ab 传入,调用 int() 会尝试把传入的值转换成 int 类型。

这个单一的 Python 函数会将任何可以转换为 int 类型的两个值相加。它可以处理像 "3" 这样的字符串,像 3.1415 这样的浮点数,布尔值(True 转换为 1False 转换为 0)等等。当你传入 int 值时,调用 int() 只是返回原值;否则,int() 会强制转换为 int 类型,如果转换失败就会抛出异常。

这就是 Python 更方便的一个例子,你可以用几行代码完成很多工作。(当然,Python 的运行速度比 C++ 慢,所以 Python 不适合某些应用。)

撰写回答