Логические операторы: and, or, not
Логические операторы: and, or, not
В предыдущих уроках вы научились сравнивать значения и получать True или False. Но реальные условия часто сложнее: «пользователь вошёл в систему и является администратором», «возраст меньше 18 или больше 65», «флаг не установлен». Для таких составных условий в Python используются три логических оператора: and, or, not.
Оператор and
and возвращает True, только если оба операнда истинны. Если хотя бы один False — результат False:
print(True and True) # True
print(True and False) # False
print(False and True) # False
print(False and False) # False
Практический пример — проверка диапазона:
age = 25
has_passport = True
can_travel = age >= 18 and has_passport
print(can_travel) # True — оба условия выполнены
Оператор or
or возвращает True, если хотя бы один операнд истинен. Только если оба False — результат False:
print(True or True) # True
print(True or False) # True
print(False or True) # True
print(False or False) # False
Пример — альтернативные способы оплаты:
has_cash = False
has_card = True
can_pay = has_cash or has_card
print(can_pay) # True — хотя бы один способ есть
Оператор not
not инвертирует булево значение: True → False, False → True:
print(not True) # False
print(not False) # True
is_banned = False
print(not is_banned) # True — пользователь не забанен
Приоритет логических операторов
Порядок применения: not имеет наивысший приоритет, затем and, затем or. Это аналог приоритета умножения над сложением в арифметике.
# not применяется первым
print(not True or False) # False: (not True) or False → False or False
print(not (True or False)) # False: not (True) → False
# and применяется перед or
print(True or False and False) # True: True or (False and False) → True or False
print((True or False) and False) # False: True and False
Когда выражение сложное — всегда расставляйте скобки явно. Это делает код понятнее:
is_adult = age >= 18
is_member = True
is_blocked = False
# С явными скобками хорошо читается:
has_access = (is_adult and is_member) and not is_blocked
Ленивые вычисления (short-circuit evaluation)
Python не вычисляет правую часть выражения, если результат уже известен из левой. Это называется ленивыми (или короткими) вычислениями.
- Для
and: если левый операндFalse— правый не вычисляется (и так ужеFalse). - Для
or: если левый операндTrue— правый не вычисляется (и так ужеTrue).
x = 0
# Без short-circuit: 10 / x вызвало бы ZeroDivisionError
# С short-circuit: левый операнд (x != 0) == False → правый не вычисляется
result = x != 0 and 10 / x > 2
print(result) # False — деления не было
Это полезно для защиты от ошибок: сначала проверяем «можно ли выполнить операцию», и только если да — выполняем.
Логические операторы с не-булевыми значениями
Интересная особенность Python: and и or работают не только с bool, а с любыми значениями. Они возвращают один из операндов, а не просто True/False.
Правило:
a and b: еслиa— ложное значение, возвращаетa; иначе возвращаетb.a or b: еслиa— истинное значение, возвращаетa; иначе возвращаетb.
print(0 and "hello") # 0 (0 — ложное, вернули его)
print(5 and "hello") # 'hello' (5 — истинное, вернули b)
print("" or "default") # 'default' (пустая строка — ложная)
print("name" or "default") # 'name' (непустая строка — истинная)
Это позволяет писать удобные «значения по умолчанию»:
username = ""
display_name = username or "Гость"
print(display_name) # Гость — потому что username пустая строка (ложная)
username = "Алиса"
display_name = username or "Гость"
print(display_name) # Алиса
Комбинирование с операторами сравнения
Чаще всего логические операторы используются вместе с операторами сравнения:
age = 22
score = 85
# Сложное условие с and:
is_eligible = age >= 18 and age <= 35 and score >= 80
print(is_eligible) # True
# То же через цепочку сравнений:
is_eligible2 = 18 <= age <= 35 and score >= 80
print(is_eligible2) # True
# Условие с or:
day = "суббота"
is_weekend = day == "суббота" or day == "воскресенье"
print(is_weekend) # True
Таблица истинности в одном месте
# and: True только если оба True
print(f"T and T = {True and True}") # True
print(f"T and F = {True and False}") # False
print(f"F and T = {False and True}") # False
print(f"F and F = {False and False}") # False
# or: False только если оба False
print(f"T or F = {True or False}") # True
print(f"F or F = {False or False}") # False
Проверь себя
Что выведет следующий код?
x = 10
print(x > 5 and x < 20)
print(x < 5 or x > 8)
print(not x == 10)
x > 5 and x < 20→True and True→Truex < 5 or x > 8→False or True→Truenot x == 10→not True→False
Итог
andвозвращаетTrueтолько при оба-истина; иначеFalse.orвозвращаетTrueпри хотя-бы-один-истина;Falseтолько при оба-ложь.notинвертирует:True→Falseи наоборот.- Приоритет:
not>and>or; при сомнениях — ставьте скобки. - Короткие вычисления: Python не вычисляет правый операнд, если результат уже определён левым.
andиorвозвращают один из операндов (не обязательноbool); это позволяет задавать значения по умолчанию черезx or default.
В следующем уроке разберём сокращённые формы операторов присваивания: +=, -=, *= и другие.