Почему это выражение возвращает True, хотя математически должно быть False?
x = 5 y = 10 z = 7
print(x < y > z) # True print(x < y and y > z) # Тоже True
Но почему это работает так странно?
print(5 < 10 > 7) # True print(5 < 10 > 15) # False Я знаю, что 5 < 10 > 7 в математике записывается как 5 < 10 и 10 > 7, но это же два разных сравнения! Почему Python позволяет так писать? И почему 5 < 10 > 15 возвращает False, хотя 5 < 10 — True, а 10 > 15 — False? Это же логическое И, значит должно быть False — здесь всё правильно, но смущает сама запись. Объясните механизм.
1 ответ
это фича питона — цепочки сравнений. x < y > z он разворачивает в (x < y) and (y > z), причём y вычисляется всего один раз. то есть 5 < 10 > 7 это 5 < 10 and 10 > 7 → True, а 5 < 10 > 15 → на второй части 10 > 15 → False. ничего мистического, просто питон разрешает писать сравнения цепочкой, прямо как в математике a < b < c.
кстати именно поэтому 1 < 2 < 3 работает как ожидаешь. во многих других языках так нельзя — там 1 < 2 сначала даст True, а потом True < 3 посчитает булево как число, и получится ерунда)