Ответ: False
Если предположить, что это выражение состоит из двух отдельных операций, то слева на право:
Фишка в том, что
Разберем, что тут происходит. Загружаем в стек две константы и дублируем последнюю для сравнения потом. Переворачиваем стек. Вытягиваем 2 константы, сравниваем. Кладем результат в стек. Если Фолс, то выходим. Если Тру, то попаем Тру из стека. Загружаем третюю константу, и сравниваем со второй, сдублированой раньше. Можете самостоятельно дизассемблоировать 1 < 2 < 3 < 4… Код будет похож на код выше, только соответствующие блоки будут повторяться. И все равно это будет один сложный оператор.
А вот код
Зачем такой оператор нужен, ведь понятьнее писать
Следующим кодом:
Всем хорошего дня!
ПС. А есть ли подобные, сложные операторы в других языках?
Если предположить, что это выражение состоит из двух отдельных операций, то слева на право:
1 < 3 = True, True(понимаем 1) < 2
также долен вернуть True
, но почему-то False
.Фишка в том, что
1 < 3 < 2
это не две отдельных операции, а одна сложная. Давайте продизассемблируем (в питоновсеий дизассемблер) наше выражение. Как видим на выходе весьма спицефический код:from dis import dis
dis(lambda: 1<3<2)
1 0 LOAD_CONST 1 (1)
3 LOAD_CONST 2 (3)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 0 (<)
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_CONST 3 (2)
17 COMPARE_OP 0 (<)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
Разберем, что тут происходит. Загружаем в стек две константы и дублируем последнюю для сравнения потом. Переворачиваем стек. Вытягиваем 2 константы, сравниваем. Кладем результат в стек. Если Фолс, то выходим. Если Тру, то попаем Тру из стека. Загружаем третюю константу, и сравниваем со второй, сдублированой раньше. Можете самостоятельно дизассемблоировать 1 < 2 < 3 < 4… Код будет похож на код выше, только соответствующие блоки будут повторяться. И все равно это будет один сложный оператор.
А вот код
1<3 and 3<2
. Он весьма линеен и понятен:dis(lambda: 1<3 and 3<2)
1 0 LOAD_CONST 1 (1)
3 LOAD_CONST 2 (3)
6 COMPARE_OP 0 (<)
9 JUMP_IF_FALSE_OR_POP 21
12 LOAD_CONST 2 (3)
15 LOAD_CONST 3 (2)
18 COMPARE_OP 0 (<)
>> 21 RETURN_VALUE
Зачем такой оператор нужен, ведь понятьнее писать
1<3 and 3<2
. К примеру, я парсил yaml:age:
title: Age
items:
1: up to 18
2: 18-25
3: above 25
Следующим кодом:
def range_age(age):
for k, v in data['age'].items.items():
v = v.replace('up to','{}<')
v = v.replace('above','{}>')
v = v.replace('-','<={}<=')
if eval(v.format(age)):
return k
Всем хорошего дня!
ПС. А есть ли подобные, сложные операторы в других языках?