Как работает интервал сравнения?

Как-то это работает:

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

print in_range(0, 5, 10)  # True
print in_range(0, 15, 10)  # False

Однако я не могу понять порядок операций здесь. Пусть тест False:

print 0 <= 15 <= 10  # False
print (0 <= 15) <= 10  # True
print 0 <= (15 <= 10)  # True

Ясно, что это не решение простого порядка операций. Является ли сравнение интервалов специальным оператором или что-то еще происходит?

Ответы

Ответ 1

В отличие от большинства языков, Python поддерживает цепные операторы сравнения и оценивает их, поскольку они будут оцениваться в обычной математике.

Эта строка:

return min <= test <= max

оценивается Python следующим образом:

return (min <= test) and (test <= max)

Большинство других языков, однако, оценили бы это следующим образом:

return (min <= test) <= max

Ответ 2

Как указано в документации 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, за исключением того, что каждое выражение оценивается не более одного раза.