为什么这个python函数不起作用?

时间:2013-04-11 21:39:16

标签: python function types

为什么这不起作用?

def distance_from_zero(x):        
    if type(x) == int or float:
        return abs(x) 
    else:
        return "Not an integer or float!"

print distance_from_zero(2050)

然而,这是正确答案,这是一回事!

def distance_from_zero(x):    

    if type(x) == int or type(x) == float:
        return abs(x) 
    else:
        return "Not an integer or float!"

print distance_from_zero(2050)

1 个答案:

答案 0 :(得分:8)

这些不是同样的事情。比较这两行:

if type(x) == int or float:

if type(x) == int or type(x) == float:

这就是区别。

第一个是检查type(x) == int,然后检查结果并or将其与float一起使用,如果True它将返回xintfloat,如果是其他任何内容。由于Truefloat都是真值,if部分将始终发生,而else将永远不会发生。

第二个是检查type(x) == inttype(x) == floator。因此,如果Truexintx,则会返回float,如果是False则为in

您可以使用if type(x) in (int, float) 运算符简化代码:

isinstance

但它仍然不是很好的Python。如果您真的想要键入切换,您几乎总是希望使用if isinstance(x, (int, float)): 而不是比较类型:

int

这意味着如果代码传递给int的子类,则代码将起作用。但它仍然不适用于long或某些自定义设计的整数类型的包装,甚至(在Python 2.x中)if isinstance(x, numbers.Real) 。所以,更好的版本是:

float

这会为intlongnumbers.Real以及其他各种内置类型以及这些类型的任何子类以及使用abs注册自身的任何内容返回True ABC

但实际上,你通常根本不想打字。 Python是围绕鸭子打字而设计的。您在此关注的是,您可以成功将其传递给try: return abs(x) except TypeError: return "Not a number!" 。只要你能做到,谁会关心它实际上是什么类型?所以:

return abs(x)

或者,更好的是,不是捕获异常并返回一个字符串(这意味着任何调用者都必须处理数字和字符串,依此类推),只需让异常传播:

{{1}}