Каждый раз, когда у вас возникают подобные сомнения, вы можете использовать модуль dis
, в вашем случае я использую лямбда-функцию для оценки процесса:
func = lambda x: x % 2 == 0 & x >= 6 & x <= 20
это дает нам следующий дизассемблированный код :
0 LOAD_FAST 0 (x)
2 LOAD_CONST 1 (2)
4 BINARY_MODULO
6 LOAD_CONST 2 (0)
8 LOAD_FAST 0 (x)
10 BINARY_AND
12 DUP_TOP
14 ROT_THREE
16 COMPARE_OP 2 (==)
18 JUMP_IF_FALSE_OR_POP 40
20 LOAD_CONST 3 (6)
22 LOAD_FAST 0 (x)
24 BINARY_AND
26 DUP_TOP
28 ROT_THREE
30 COMPARE_OP 5 (>=)
32 JUMP_IF_FALSE_OR_POP 40
34 LOAD_CONST 4 (20)
36 COMPARE_OP 1 (<=)
38 RETURN_VALUE
>> 40 ROT_TWO
42 POP_TOP
44 RETURN_VALUE
объяснение просто:
- Получить переменную
x
значение - Получить const
2
значение - Получить
modulo
сравнение между 2
и x
, ответ 0
, когда вы используете 12
в качестве значения параметра. - Получить const
0
значение - Получить var
x
значение - Получить двоичное
and
сравнение между 0
и x
, естественно, побитовая операция между любым значением (например: b'1100'
) и b'0000'
вернет 0
. - Далее значения сохраняются в TOP и сравниваются с оператором
==
. Это означает, что, как говорили другие ответы, (x % 2) == (0 & x)
в это время, когда x
является 12
, переведенная операция 0 == 0
(True). - С проверкой результата
==
, если это False ( в этом случае перейдите к строке 40
байт-кода), иначе удалите результат (POP) из TOS (верх стека) - Получите const
6
значение - Получите var
x
значение - Еще одно сравнение
and
, на этот раз между 6
(b'0110'
) и 12
(x
= b'1100'
) с результатом 4
(b'0100'
) - Последний результат сохраняется в TOP и сравнивается с оператором
>=
с последним сохраненным значением (0 >= 4
, как сказано в других ответах). - Ответ от
0 >= 4
тогда, оценивается в следующей инструкции, False
вызывает переход кода непосредственно к инструкции 40
(Return False), даже не проверяя последний случай.
Конечно, это объяснение байт-кода для как работает python, краткий ответ - это 0 & n >= 6 & n
, имея это в виду, мы можем предположить, что каждое число отличается от m 0 вернет False для этой оценки, потому что побитовая операция между b'0110'
всегда будет больше 0.
TL; DR
Побитовые операторы оцениваются перед логическими операторами.
Каталожные номера
https://docs.python.org/3.8/library/dis.html Ссылка на модуль Dis.