我正在尝试查看我的参数(称为'n')是整数还是浮点数,如果是整数或浮点数则返回n的绝对值。
if type(n) == int or type(n) ==float:
return abs(n)
else:
return "blahblah"
对战
if type(n) == (int or float):
return abs(n)
else:
return "blahblah"
第二块产生的东西与我预期的不同。它在做什么?
答案 0 :(得分:5)
(int or float)
将评估为int
,因此type(n) == (int or float)
相当于type(n) == int
。所以基本上第一个版本是检查n
的类型是int
还是float
,而第二个版本只是检查它是否是int
(在非常令人困惑的方式)。
请注意,这些方法都不是正确的方法,以下是更好的方法:
if isinstance(n, (int, float)):
return abs(n)
else:
return "blahblah"
或使用EAFP方法:
try:
return abs(n)
except Exception:
return "blahblah"
作为旁注,重构x == a or x == b
的一般方法是使用x in (a, b)
。因此,在这种情况下,您也可以使用if type(n) in (int, float)
,但在这种情况下,使用isinstance()
会更好,因为它也可以与int
或float
的子类一起正常使用。
答案 1 :(得分:0)
return必须是以def函数开头的函数:
答案 2 :(得分:0)
Python的“和”和“或”操作将始终返回其中一个操作数 - 而不是真值。
非常重要(快速)阅读:http://docs.python.org/2/library/stdtypes.html#truth-value-testing
第5.1和5.2节都谈到了这一点。
慢慢地把它拼出来......
type(n) == (int or float)
解释器必须做的第一件事是评估相等比较两边的表达式:'=='
如果'n'是3.1415,我们得到:
<type 'float'> == <type 'int'>
LHS很容易看到,但RHS很棘手:
(int or float)
or运算符将尝试从LHS开始获取操作数的布尔表示:
bool(int) #yes, what is the boolean representation of the integer class?
嘿,它有一个 - 你猜对了!
True
短路启动,或运算符返回操作数(参见上面的文档)
(int or float) #will always return <type 'int'>
回到我们开始的地方:
<type 'float'> == <type 'int'> #False
你可能正在寻找的是非常可读的:
if type(n) in (int, float,):
return abs(n)
else:
return "blahblah"