Побитовый оператор & в цепочечном сравнении
var = 86
print((var < 90) & (var >= 80))
печать True
,
Но зачем все это печатать False
?
print(var < 90 & var >= 80)
print(var < 90 & (var >= 80))
print((var < 90) & var >= 80)
print(var < 90 & True)
3 ответа
Вы должны использовать and
оператор вместо логических операций.
Поскольку Python поддерживает связывание реляционных операторов (т.е. вы можете использовать 0 < var < 100
вместо 0 < var and var < 100
) и обрабатывает двоичные операции (т.е. сложение, вычитание, побитовые операции и т. д.) перед реляционными операторами из-за приоритета операторов, все неудачные случаи, которые вы опубликовали, на самом деле означают что-то другое.
var < 90 & var >= 80
эквивалентно(var < 90 & var) and (90 & var >= 80)
var < 90 & (var>=80)
эквивалентноvar < 90 & True
для которого посмотрите на 4-й случай.(var<90) & var>=80
также похож на 4-й случай (это решаетTrue & var >= 80
который затем разрешит0 >= 80
).var < 90 & True
эквивалентноvar < (90 & True)
, Реализация&
оператор предназначен для возврата0
если один из операндов не является целым числом (что является еще одной из самых больших ошибок динамической типизации), именно поэтому все подобные подобные операторы разрешаются вvar < 0
что неверно
Это из-за приоритета оператора
принимать print( var<90 & True)
В качестве примера,
print( var<90 & True)
эквивалентно print( var < (90 & True))
и следовательно это дает Ложь.
Однако, если вы поставите в скобках в нужном месте, то есть print( (var<90) & True)
тогда это даст True.
Побитовый оператор &
имеет более высокий приоритет, чем операторы сравнения, поэтому 90 & var
сначала оценивается, а затем происходит цепное сравнение.
>>> var = 86
>>> var<90 & var>=80 # var<90, and '90&var' is greater than or equal to 80
False
>>> var<(90 & var)>=80 # same as above
False
>>> (var<90) & (var>=80)
True