21

我很好奇是否可以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

为了更好的衡量,我尝试了更多的数字,这次是在负数区域。哪里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;
}

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


在此处记录。

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

而且,作为一个例子,

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

4

2 回答 2

29

在此处记录。

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

而且,作为一个例子,

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

于 2013-09-12T03:56:30.690 回答
1

Python“自然地”链接关系运算符。请注意,Python 的关系运算符包括inand is(及其否定),当将它们与符号关系运算符混合时可能会导致一些令人惊讶的结果。

于 2013-09-12T03:56:30.623 回答