Является ли `a <b <c` действительным 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

Просто для хорошей меры я попробовал больше цифр, на этот раз в отрицательной области. Где a, b, c = -10, -9, -8. Тест прошел еще раз. Даже тестовый костюм на более высоком уровне работает a, b, c = 10, 11, 12. Или даже a, b, c = 10, 20, 5.

И тот же эксперимент, выполненный на С++. Это был мой менталитет, входящий в него:

#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, поэтому я могу видеть, насколько они предоставляют такие функции.

Ответ 1

Это описано здесь.

Формально, если 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 оценивается только один раз (но в обоих случаи z вообще не оцениваются, когда x < y считается ложным).

Ответ 2

Реляционные операторы цепей Python "естественно". Обратите внимание, что реляционные операторы Python включают в себя in и is (и их негативы), что может привести к неожиданным результатам при их смешивании с символическими реляционными операторами.

Ответ 3

a < b < c
он выполняется следующим образом

(a < b) c
(false) < c = > (0) < c
правда.....
это происходит для вас