Why does switching order of OR statement fix TypeError: '<=' not supported between 'str' and 'int'?

Why does switching order of OR statement fix TypeError: '<=' not supported between 'str' and 'int'?

我正在做一些基本的数据验证,但我很困惑。我有以下功能:

def is_int_gt2(num):
    if num <= 2 or type(num) != int:
        return False
    else:
        return True

当我调用 is_int_gt2(-1) 时,我得到 False。当我调用 is_int_gt2(5) 时,我得到 True。到目前为止,一切都很好。但是如果我调用 is_int_gt2('a'),我会得到 TypeError: '<=' not supported between instances of 'str' and 'int'

让我感到困惑的是,当我在 or 语句中切换条件的顺序时,该函数完美运行!:

def is_int_gt2(num):
    if type(num) != int or num <= 2:
        return False
    else:
        return True

所以现在我有一个工作函数,但我不知道为什么。 为什么切换条件的顺序会修复函数?谢谢。

在您的第一个代码块中,num <= 2 表达式排在第一位。当您传入 'a' 时,python 尝试使用 <= 比较 'a'2,导致错误。

但是当type(num) != int在前时,python首先检查a的类型,即str。而由于str != int,表达式为True,跳出if语句;从不检查它是否是 <= 2.

@Have a nice day 回答了这个问题,但我建议改用 try and except 块

try:
    if num > 2:
        return True
    else:
        return False
except TypeError:
    return False

这样代码会更简洁,因为您不会遇到简单地更改比较顺序会产生错误的问题。处理得当,也很容易理解

编辑: 要更好地理解 or 运算符,请参阅 How to use the Python or operator

您描述的行为是因为短路评估

引用来源: “短路评估 Python 有时可以在对涉及的所有子表达式和对象求值之前确定布尔表达式的真值。例如,Python 或运算符一旦发现被认为是真的东西就会停止计算操作数。例如,以下表达式始终为 True:

>>> True or 4<3
True

如果 or 表达式中的第一个操作数的计算结果为真,无论第二个操作数的值如何(4 < 3 为假),则表达式被视为真,并且永远不会计算第二个操作数。这称为短路(惰性)评估。"

编辑 2: 'After reading your comment about performance.' 我用timeit模块检查了两种方法,结果如下:

案例 1:num=1

----------------------
num = 1
try except method
time taken is: 0.24674580000000002
----------------------
num = 1
if else method
time taken is: 0.3399378

备注:尝试except方法更好

案例 2:num = 3

----------------------
num = 3
try except method
time taken is: 0.2548527
----------------------
num = 3
if else method
time taken is: 0.5341225000000001

备注:尝试except方法更好

案例 3:num = "a"

----------------------
num = 'a'
time taken is: 1.2462476
----------------------
num = 'a'
time taken is: 0.3462103999999999

备注:if else方法更好

结论: 很明显,try except 方法速度更快,但实际捕获到异常时除外。所以只要 num 是一个整数,try except 会更好,但是如果 num 不是一个整数,那么 if else 方法会好得多。由您决定要使用哪一个

注意:这里给出的时间是我的系统特有的。您的系统可能会略有不同。而这里所说的时间是每个方法一百万(1000000)次循环中最好的时间

关于功能设计方面 - Return False or allow Exception ?

在我看来,当输入不是 int 时,return False 是不正确的。将 'a' 与 2 进行比较没有意义,因为无法比较它们。

因此,最好有例外 TypeError 而不是 returning False.

此外,根据函数名称 is_int_gt2(),它需要一个 int。因此,该函数可以采用 int 中的输入。如果不是 int,则会引发异常。

抑制异常并 returning False 可以隐藏使用此函数的应用程序中的潜在错误。

简化代码为:

def is_int_gt2(num):
    if num <= 2:
        return False
    else:
        return True