var = 86
print((var<90) & (var>=80))
это дает ПравдаPython Битовые операторы '&' Оператор
Но
print(var<90 & var>=80)
print(var<90 & (var>=80))
print((var<90) & var>=80)
print(var<90 & True)
`
почему все они дают ложь?
var = 86
print((var<90) & (var>=80))
это дает ПравдаPython Битовые операторы '&' Оператор
Но
print(var<90 & var>=80)
print(var<90 & (var>=80))
print((var<90) & var>=80)
print(var<90 & True)
`
почему все они дают ложь?
Это из-за Operator precedence
Возьмите print(var<90 & True)
в качестве примера,
print(var<90 & True)
эквивалентно print(var < (90 & True))
и, следовательно, дает значение False.
Однако, если вы положите скобки в нужное место, то есть print((var<90) & True)
, тогда оно выдаст True.
Какой оператор будет выполнен первым? – dsgdfg
Этот документ не содержит определений 'priority'. Я спрашиваю 'a >> b & c <
@dsgdfg В документации говорится: «Следующая таблица суммирует приоритеты операторов в Python, начиная с самого низкого приоритета (наименьшая привязка) до наивысшего приоритета (большинство привязок). Операторы в том же поле имеют одинаковый приоритет». –
Побитовый оператор &
имеет более высокий приоритет, чем операторы сравнения, поэтому сначала оценивается 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
Вы должны использовать оператор 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
, что является ложным.
Почему вы пытаетесь использовать побитовый оператор для выполнения булевой операции? –
Попробуйте заменить '&' на 'и'; то, что вы делаете, на самом деле не имеет смысла. – 101
Я знаю, что я должен использовать оператор «и». Я просто хотел знать, почему они давали ложь. @ IgnacioVazquez-Abrams –