间隔比较如何工作?

hug*_*hes 22 python syntax comparison

不知何故,这工作:

def in_range(min, test, max):
    return min <= test <= max

print in_range(0, 5, 10)  # True
print in_range(0, 15, 10)  # False
Run Code Online (Sandbox Code Playgroud)

但是,我不能完全弄清楚这里的操作顺序.我们来测试一下这个False案子:

print 0 <= 15 <= 10  # False
print (0 <= 15) <= 10  # True
print 0 <= (15 <= 10)  # True
Run Code Online (Sandbox Code Playgroud)

显然,这并不是解决简单的操作顺序问题.区间比较是一个特殊的算子,还是其他的东西?

iCo*_*dez 32

与大多数语言不同,Python支持链式比较运算符,它会对它们进行评估,因为它们将在普通数学中进行评估.

这一行:

return min <= test <= max
Run Code Online (Sandbox Code Playgroud)

由Python评估如下:

return (min <= test) and (test <= max)
Run Code Online (Sandbox Code Playgroud)

然而,大多数其他语言会像这样评估它:

return (min <= test) <= max
Run Code Online (Sandbox Code Playgroud)

  • 你甚至可以做一些更疯狂的东西,比如'a <b <= c <d <= e` ...虽然一旦你进行了2次以上的比较就开始变得非常困惑 (2认同)
  • 因此,比较操作从左到右评估,即如果`min <= test`评估为'False`,则不评估test <= max`?但我想在`min <= test <= max`中,`test`总是只被评估一次,而在表达式`(min <= test)和(test <= max)`中,`test`可以被评估一两次(取决于`min <= test`的值)? (2认同)

Ada*_*eld 5

Python 文档中所述

比较可以任意链接,例如,x < y <= z等价于x < y and y <= z,除了y只计算一次(但在这两种情况下z,当x < y发现为假时根本不计算)。

形式上,如果a , b , c , ..., y , z是表达式并且op1 , op2 , ..., opN是比较运算符,则a op1 b op2 c ... y opN z等价于a op1 b and b op2 c and ... y opN z,不同之处在于每个表达式最多计算一次。