【问题标题】:Why does switching order of OR statement fix TypeError: '<=' not supported between 'str' and 'int'?为什么 OR 语句的切换顺序修复 TypeError: '<=' not supported between 'str' and 'int'?
【发布时间】:2021-08-05 10:28:55
【问题描述】:

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

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: '&lt;=' 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

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

【问题讨论】:

    标签: python validation types logic typeerror


    【解决方案1】:

    关于功能设计方面 - Return False 还是允许 Exception ?

    在我看来,当输入不是int 时返回False 是不正确的。比较 'a' 和 2 没有意义,因为没有办法比较它们。

    因此,最好有异常 TypeError 而不是返回 False

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

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

    简化的代码是:

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

    【讨论】:

      【解决方案2】:

      @Have a nice day 回答了这个问题,但我建议改用 try 和 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

      编辑 2: “在阅读了你关于表现的评论之后。” 我用timeit模块检查了这两种方法,结果如下:

      案例一: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 是整数,试试 except 更好,但是如果 num 不是整数,那么 if else 方法会好很多。由您决定要使用哪一个

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

      【讨论】:

      • try except 块是否会显着降低性能?它比 or 语句慢吗?谢谢!
      【解决方案3】:

      在您的第一个代码块中,num &lt;= 2 表达式首先出现。当你传入'a'时,python会尝试使用&lt;=比较'a'2,导致报错。

      但是当type(num) != int是第一个时,python首先检查a的类型,即str。而由于str != int,表达式为True,突破了if语句;从不检查它是否是&lt;= 2

      【讨论】:

        猜你喜欢
        • 2018-09-08
        • 2020-01-11
        • 2022-12-06
        • 1970-01-01
        • 2019-04-07
        • 2021-05-17
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多