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

Mr.*_*ill -4 python types function

为什么这不起作用?

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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 8

这些都不是一回事.比较这两行:

if type(x) == int or float:

if type(x) == int or type(x) == float:
Run Code Online (Sandbox Code Playgroud)

这就是区别.

第一个是检查type(x) == int,然后将结果和结果or一起使用float,所以它将返回,True如果xint,float如果它是其他任何东西.由于这两个Truefloat是truthy值,该if部分总是会发生,并且else永远不会发生.

第二个被检查type(x) == int,并type(x) == floator荷兰国际集团在一起.因此,这将返回True如果xint,或者x是一个float,而False如果是别的.

您可以使用in运算符简化代码:

if type(x) in (int, float)
Run Code Online (Sandbox Code Playgroud)

但它仍然不是很好的Python.如果你真的想要键入切换,你几乎总是希望用它isinstance而不是比较类型:

if isinstance(x, (int, float)):
Run Code Online (Sandbox Code Playgroud)

这意味着如果代码传递了代码,那么代码将会起作用int.但是它仍然不适用于包装int,或者一些定制设计的整数类型,甚至(在Python 2.x中)a long.所以,更好的版本是:

if isinstance(x, numbers.Real)
Run Code Online (Sandbox Code Playgroud)

返回true了float,int,long,和其他各种内置类型,这些类型的任何子类,以及任何与注册自身numbers.RealABC.

但实际上,你通常根本不想打字.Python是围绕鸭子打字而设计的.你在这里关心的是你可以成功地将它传递给abs.只要你能做到,谁会关心它实际上是什么类型?所以:

try:
    return abs(x)
except TypeError:
    return "Not a number!"
Run Code Online (Sandbox Code Playgroud)

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

return abs(x)
Run Code Online (Sandbox Code Playgroud)