在C / C ++中,当我们定义一个函数签名时,除了允许函数采用的参数之外,我们还强调返回类型(
)。在python中,函数可以或不可以(None)返回值,但函数签名只构成允许函数执行的参数。
我们如何在python中理解这一点?
答案 0 :(得分:3)
Python不使用静态类型。
在C ++中,类型签名实际上被认为是函数名称的一部分;如果你拨打foo(2)
和foo("wow")
,你实际上是在调用两个不同的功能。
在Python中,任何特定的函数都只是一个函数对象。如果你有参考,你可以打电话给它;并且您可以使用其名称进行查找,以获取对它的引用。无论哪种方式,“类型签名”无关紧要。
另外,在C ++中,如果要重载一个函数,你将多次声明它,使用不同的类型签名;在Python中,您将声明它一次,但利用“duck typing”使其使用不同的参数做正确的事情。这是一个例子:
// 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中完成很多工作。 (当然Python比C ++慢得多,因此Python不适合某些应用程序。)