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)
这些都不是一回事.比较这两行:
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
如果x
是int
,float
如果它是其他任何东西.由于这两个True
和float
是truthy值,该if
部分总是会发生,并且else
永远不会发生.
第二个被检查type(x) == int
,并type(x) == float
和or
荷兰国际集团在一起.因此,这将返回True
如果x
是int
,或者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.Real
ABC.
但实际上,你通常根本不想打字.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)