关于OR运算符如何在python中工作的困惑

时间:2014-02-21 00:00:01

标签: python if-statement types

我正在尝试查看我的参数(称为'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"

第二块产生的东西与我预期的不同。它在做什么?

3 个答案:

答案 0 :(得分:5)

由于or operator在Python中的工作方式,

(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()会更好,因为它也可以与intfloat的子类一起正常使用。

答案 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"