有人可以解释这段代码的用途吗?
shift, range = order < self.order and (1, (to, orig-1)) or (-1, (orig+1, to))
我知道它会根据order < self.order
我不知道为什么那里有and
和or
声明
答案 0 :(得分:3)
来自documentation of boolean expressions in Python -
表达式
x and y
首先评估x
;如果x
为false,则返回其值;否则,将评估y
并返回结果值。表达式
x or y
首先评估x;如果x
为真,则返回其值;否则,评估y并返回结果值。
因此,Python中的and
/ or
表达式不一定会返回True
或False
,而是 -
对于and
,它会返回上次评估的False
值,或者如果所有值都为True
,则会返回上次评估的值。
对于or
,它返回上次评估的True
值,或者如果所有值都为False
,则返回上次评估的值。
因此,在您的情况下,如果条件为真,则返回(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