这些不是一回事。比较这两行:
if type(x) == int or float:
if type(x) == int or type(x) == float:
这就是区别。
第一个是检查type(x) == int,然后获取结果并or用 ing 它float,所以它会返回Trueifx是 an int,float如果它是其他任何东西。由于两者True和float都是真实值,因此该if部分将永远发生,而else永远不会发生。
第二个是检查type(x) == int, 和type(x) == float, 并or一起检查它们。所以,它会返回Trueif xis anint或 if xis a float,False如果它是其他任何东西。
您可以使用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这将为、int、long和各种其他内置类型、这些类型的任何子类以及向numbers.RealABC注册自身的任何内容返回 True 。
但实际上,您通常根本不想进行类型切换。Python 是围绕鸭子类型设计的。您在这里关心的是您是否可以将其成功传递给abs. 只要你能做到,谁在乎它实际上是什么特定类型?所以:
try:
return abs(x)
except TypeError:
return "Not a number!"
或者,更好的是,与其捕获异常并返回一个字符串(这意味着任何调用者都必须同时处理数字和字符串,等等),而是让异常传播:
return abs(x)