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