是一个<b <c`有效的python?

jak*_*451 16 python

我很好奇,看看我是否可以使用它a<b<c作为条件而不使用标准a<b and b<c.所以我试了一下,我的测试结果通过了.

a = 1
b = 2
c = 3

assert(a<b<c) # In bounds test
assert(not(b<a<c)) # Out of bounds test
assert(not(a<c<b)) # Out of bounds test
Run Code Online (Sandbox Code Playgroud)

只是为了好的衡量,我尝试了更多的数字,这次是在负面区域.哪里a, b, c = -10, -9, -8.测试再次通过.即使是更高范围的测试套装也能正常工作a, b, c = 10, 11, 12.甚至a, b, c = 10, 20, 5.

和C++一样的实验.这是我的心态:

#include <iostream>

using namespace std;

int main()
{
    int a,b,c;
    a=10;
    b=20;
    c=5;
    cout << ((a<b<c)?"True":"False") << endl; // Provides True (wrong)
    cout << ((a<b && b<c)?"True":"False") << endl; // Provides False (proper answer)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我最初认为这个实现是无效的,因为我遇到的其他语言都会在它到达之前评估一个布尔值c.使用这些语言,a<b将评估为布尔值并继续评估,b<c因为它将尝试针对数字计算布尔值(很可能抛出编译时错误或伪造预期的比较),因此将无效.出于某种原因,这对我来说有点不安.我想我只需要放心,这是语法的一部分.提供Python文档中提供此功能的位置的参考也很有帮助,因此我可以看到它们在多大程度上提供了这样的功能.

Suk*_*lra 24

在此处记录.

形式上,如果a,b,c,...,y,z是表达式而op1,op2,...,opN是比较运算符,则op1 b op2 c ... y opN z等效于op1 b和b op2 c和... y opN z,除了每个表达式最多被评估一次.

并且,作为一个例子,

比较可以任意链接,例如,x <y <= z等于x <y和y <= z,除了y仅被评估一次(但在两种情况下,当x <y被发现时,根本不评估z是假的).