为什么这不起作用?
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)
答案 0 :(得分:8)
这些不是同样的事情。比较这两行:
if type(x) == int or float:
if type(x) == int or type(x) == float:
这就是区别。
第一个是检查type(x) == int
,然后检查结果并or
将其与float
一起使用,如果True
它将返回x
是int
,float
,如果是其他任何内容。由于True
和float
都是真值,if
部分将始终发生,而else
将永远不会发生。
第二个是检查type(x) == int
,type(x) == float
和or
。因此,如果True
为x
或int
为x
,则会返回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
这会为int
,long
,numbers.Real
以及其他各种内置类型以及这些类型的任何子类以及使用abs
注册自身的任何内容返回True ABC
但实际上,你通常根本不想打字。 Python是围绕鸭子打字而设计的。您在此关注的是,您可以成功将其传递给try:
return abs(x)
except TypeError:
return "Not a number!"
。只要你能做到,谁会关心它实际上是什么类型?所以:
return abs(x)
或者,更好的是,不是捕获异常并返回一个字符串(这意味着任何调用者都必须处理数字和字符串,依此类推),只需让异常传播:
{{1}}