谁能解释一下这个代码是干什么用的?
shift, range = order < self.order and (1, (to, orig-1)) or (-1, (orig+1, to))
我知道它将根据order < self.order
我不知道的是为什么这里有一个and
和or
语句
来自Python布尔表达式的文档-
表达式
x and y
首先求值x
;如果x
为false,则返回其值;否则,计算y
并返回结果值。表达式
x or y
首先求值x;如果x
为true,则返回其值;否则,计算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
同样,虽然不直接适用于条件,但在一般情况下,适用于-
cond and a or b
如果cond
是一个类似true的值,而a
是一个类似false的值(如0
或空字符串/列表/元组等),它将返回b
。例子——
>>> 1 < 5 and 0 or 2
2
因此,最好使用等效的if..else
三元表达式,示例-
a if cond else b
这段代码中有一个逻辑错误-当order < self.order
求值为True
时,将引发异常。
我相信这就是我想要的:
shift, range = (1, (to, orig - 1)) if order < self.order else (-1, (orig + 1, to))
当order < self.order
为True时,将1赋值为shift, (to, orig - 1)
赋值为range;当order >= self.order
(orig + 1, to)
赋值为range。