-4

为什么这行不通???

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)
4

1 回答 1

8

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

if type(x) == int or float:

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

这就是区别。

第一个是检查type(x) == int,然后获取结果并or用 ing 它float,所以它会返回Trueifx是 an intfloat如果它是其他任何东西。由于两者Truefloat都是真实值,因此该if部分将永远发生,而else永远不会发生。

第二个是检查type(x) == int, 和type(x) == float, 并or一起检查它们。所以,它会返回Trueif xis anint或 if xis a floatFalse如果它是其他任何东西。

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

if type(x) in (int, float)

但它仍然不是很好的 Python。如果您真的想进行类型切换,您几乎总是希望使用isinstance而不是比较类型:

if isinstance(x, (int, float)):

这意味着如果你的代码通过了,比如说,一个int. 但它仍然不适用于,例如,包装器int,或一些定制设计的整数类型,甚至(在 Python 2.x 中) a long。所以,一个更好的版本是:

if isinstance(x, numbers.Real)

float这将为、intlong和各种其他内置类型、这些类型的任何子类以及向numbers.RealABC注册自身的任何内容返回 True 。

但实际上,您通常根本不想进行类型切换。Python 是围绕鸭子类型设计的。您在这里关心的是您是否可以将其成功传递给abs. 只要你能做到,谁在乎它实际上是什么特定类型?所以:

try:
    return abs(x)
except TypeError:
    return "Not a number!"

或者,更好的是,与其捕获异常并返回一个字符串(这意味着任何调用者都必须同时处理数字和字符串,等等),而是让异常传播:

return abs(x)
于 2013-04-11T21:40:22.073 回答