Python一线条件有条件

时间:2015-08-31 03:58:33

标签: python python-2.7

有人可以解释这段代码的用途吗?

shift, range = order < self.order and (1, (to, orig-1)) or (-1, (orig+1, to))

我知道它会根据order < self.order

的结果设置移位和范围

我不知道为什么那里有andor声明

2 个答案:

答案 0 :(得分:3)

来自documentation of boolean expressions in Python -

  

表达式x and y首先评估x;如果x为false,则返回其值;否则,将评估y并返回结果值。

     

表达式x or y首先评估x;如果x为真,则返回其值;否则,评估y并返回结果值。

因此,Python中的and / or表达式不一定会返回TrueFalse,而是 -

  1. 对于and,它会返回上次评估的False值,或者如果所有值都为True,则会返回上次评估的值。

  2. 对于or,它返回上次评估的True值,或者如果所有值都为False,则返回上次评估的值。

  3. 因此,在您的情况下,如果条件为真,则返回(1, (to, orig-1))的值,否则返回(-1, (orig+1, to))的值。

    非常简单的例子来说明这一点 -

    >>> 1 < 5 and 2 or 4
    2
    >>> 6 < 5 and 2 or 4
    4
    

    此外,虽然不能直接适用于条件,但在一般情况下,对于像< - p>这样的条件

    cond and a or b
    

    如果cond是类似True的值且a具有类似False的值(如0或空字符串/列表/元组等),则返回{{ 1}}。示例 -

    b

    因此,最好使用等效的>>> 1 < 5 and 0 or 2 2 三元表达式,例如 -

    if..else

答案 1 :(得分:1)

此代码中存在逻辑错误 - 当order < self.order评估为True时,将引发异常。

我相信这就是预期的目的:

shift, range = (1, (to, orig - 1)) if order < self.order else (-1, (orig + 1, to))

(to, orig - 1)为True时,这将指定1移位,order < self.order指定范围,将(orig + 1, to)指定为范围order >= self.order