【问题标题】:Boolean expressions in PythonPython中的布尔表达式
【发布时间】:2016-04-06 03:47:46
【问题描述】:

我正在运行一个 Python 脚本,用于测试两个条件的结合,其中一个很容易验证,另一个很难验证。假设我在 Python 中将其写为easy_boole and hard_boole。如果easy_boole == False,解释器是否总是先检查easy_boole,然后返回False?解释器是否总体上进行了优化以尽可能快地解析这些类型的语句?

【问题讨论】:

  • 是的。短路了。

标签: python boolean-expression


【解决方案1】:

来自Python Documentation

表达式 x 和 y 首先计算 x;如果 x 为假,则其值为 回来;否则,对 y 求值,结果值为 返回。

所以只要xFalse,表达式就会被计算为False

【讨论】:

    【解决方案2】:

    是的,andor 都是所谓的短路运算符。 and 表达式的计算在值为假时结束,or 表达式的计算在值为真时结束。

    您可以找到相关文档here

    下面是一段代码,您可以通过它自己观察这种行为:

    def fib(n):
        if n <= 2:
            return 1
        return fib(n-1) + fib(n-2)
    
    print(False and fib(100)) # prints False immediately
    print(True and fib(100)) # takes very, very long
    print(fib(100) and False) # takes very, very long
    

    考虑到这一点,请始终使用easy_boole and hard_boole

    【讨论】:

      【解决方案3】:

      是的,python 懒惰地评估 if 语句。例如,在以下代码中:

      if f() and g():
          print("GOOD")
      else:
          print("BAD")
      

      Python 解释器会首先检查 f() 语句,如果 f() 为 False,它会立即跳转到 else 语句。

      【讨论】:

        【解决方案4】:

        只需打开一个 REPL 并尝试:

        >>> False and 1 / 0
        False
        
        >> True or 1 / 0
        True
        
        >>> False or 1 / 0
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        ZeroDivisionError: division by zero
        

        这意味着 Python 确实会延迟计算布尔语句。

        附:这是duplicate

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-29
          • 1970-01-01
          • 2021-12-09
          • 2014-02-22
          • 2010-09-21
          • 2023-03-23
          • 2012-07-13
          • 1970-01-01
          相关资源
          最近更新 更多