【问题标题】:In which order is an if statement evaluated in PythonPython 中 if 语句的求值顺序
【发布时间】:2013-04-24 20:16:23
【问题描述】:

如果您有一个 if 语句,其中计算了多个变量或函数,它们的计算顺序是什么?

if foo > 5 or bar > 6:
    print 'foobar'

在这种特定情况下,是否会根据 5 对 foo 进行评估,然后根据 6(从左到右)对 foo 进行评估,还是从右到左进行评估?我假设 orand 的评估顺序相同。

【问题讨论】:

  • 这与if 语句的求值顺序无关,而与or 表达式的求值顺序有关。对于x = (foo > 5 or bar > 6),您会得到完全相同的规则,或者就此而言,只是将foo > 5 or bar > 6 作为一个声明。
  • 试一试,看看会发生什么。就像这样做的结果是什么;) if True or False and False and False or False:

标签: python


【解决方案1】:

只有当第一个是False时,才会先计算左边的子句,然后才是右边的子句。

这就是为什么你可以这样做:

if not person or person.name == 'Bob':
    print "You have to select a person and it can't be Bob"

没有它的破坏。

相反,使用and 子句,只有当第一个子句是True 时才会计算正确的子句:

if person and person.name:
   # ...

否则personNone时会抛出异常。

【讨论】:

  • 这是一个很有见地的答案。有谁知道包含此类规避技巧的集体参考资料?
【解决方案2】:

它将从左到右进行评估。

>>> def a():
...     print 'a'
...     return False
... 
>>> def b():
...     print 'b'
...     return False
... 
>>> print a() or b()
a
b
False
>>> def c():
...     print 'c'
...     return True
... 
>>> print c() or a()
c
True

【讨论】:

    【解决方案3】:

    为了进一步扩展 Blender 的解释,or 运算符还内置了其他东西:

    <expression A> or <expression B>
    

    这将首先评估expression A;如果计算结果为True,则运算符返回expression A。所以5 or &lt;something&gt; 将返回5,因为5 的计算结果为True

    如果expression A 计算结果为False,则返回expression B。所以0 or 5 将返回5,因为0 的计算结果为False

    当然,你可以随意链接它:

    <expr 1> or <expr 2> or <expr 3> or ... or <expr n>
    

    一般来说,or 将返回计算结果为Truefirst 表达式,但保留其原始值。如果没有计算结果为 True 的表达式,它将简单地返回最后一个表达式(计算结果为 False)。

    and 运算符以类似但相反的方式工作。它将返回 first 表达式,该表达式的计算结果为 False,但保留其原始值。如果没有计算结果为False 的表达式,它将简单地返回最后一个表达式(计算结果为True)。

    例如,0 and 55 and 0 都将返回 0,因为 0 的计算结果为 False,但 2 and 3 将返回 3,因为 3 是最后一个表达式,所有的计算结果都是到True

    无论如何(回到问题):所有表达式都是从左到右计算的,如果上面的规则允许,则不会触及其他表达式。

    【讨论】:

      【解决方案4】:

      Python 的 or 运算符短路,将从左到右计算:

      if (foo > 5) or (bar > 6):
          print 'foobar'
      

      如果foo &gt; 5,那么bar &gt; 6 甚至不会被测试,因为True or &lt;anything&gt; 将是True。如果foo 不是&gt; 5,那么bar &gt; 6 将被测试。

      【讨论】:

        【解决方案5】:

        运算符从左到右求值。 但仅当所有运算符的优先级相同时。 当运算符的优先级不相等时 算子会按照优先级执行。

        例如

        假或假或真假 假的

        对或错和对或错 是的

        假或假和真或假 假的

        即表达式中优先级最高的运算符 执行然后进一步执行。

        【讨论】:

          猜你喜欢
          • 2015-01-16
          • 2023-03-25
          • 2013-08-29
          • 2017-10-26
          • 2019-02-06
          • 2013-04-10
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          相关资源
          最近更新 更多