Урок 12 Сложные условия

and, or, not — логические операторы

⏱ ~8 мин чтения· 📘 Базовый

Логический оператор and

and возвращает True, только если оба условия истинны:

age = 25
has_license = True

if age >= 18 and has_license:
    print("Можно водить машину")

# Таблица истинности:
# True and True   -> True
# True and False  -> False
# False and True  -> False
# False and False -> False

Логический оператор or

or возвращает True, если хотя бы одно условие истинно:

is_weekend = True
is_holiday = False

if is_weekend or is_holiday:
    print("Можно отдыхать!")

# Таблица истинности:
# True or True   -> True
# True or False  -> True
# False or True  -> True
# False or False -> False

Логический оператор not

not инвертирует булево значение:

is_raining = False
if not is_raining:
    print("Зонт не нужен")

# not True  -> False
# not False -> True

Сложные составные условия

Можно комбинировать несколько операторов:

age = 20
has_ticket = True
is_vip = False

if (age >= 18 and has_ticket) or is_vip:
    print("Проход разрешён")

# Скобки помогают задать порядок вычислений

Short-circuit evaluation

Python вычисляет условия слева направо и останавливается, как только результат определён:

# Если first() вернёт False, second() не вызовется
if first() and second():
    pass

# Если first() вернёт True, second() не вызовется
if first() or second():
    pass

Законы де Моргана

Законы де Моргана позволяют преобразовать отрицание сложного выражения. Они полезны для упрощения условий и проверки «обратных» ситуаций:

not (A and B)  →  (not A) or (not B)
not (A or B)   →  (not A) and (not B)

На практике это работает так:

# Проверка, что число НЕ в диапазоне [0, 10]
x = 15

# Вариант 1: напрямую
if x < 0 or x > 10:
    print("Вне диапазона")

# Вариант 2: через отрицание и закон де Моргана
if not (x >= 0 and x <= 10):
    print("Вне диапазона")

# Оба варианта эквивалентны!

Ещё пример:

# Не пропускать пользователей, у которых нет билета ИЛИ они не VIP
# Исходное условие: not (has_ticket and is_vip)
# По закону де Моргана: (not has_ticket) or (not is_vip)

if not (has_ticket and is_vip):
    print("Доступ запрещён")

# Эквивалентно:
if not has_ticket or not is_vip:
    print("Доступ запрещён")

💡 Совет: Законы де Моргана часто используются, чтобы переписать условие в более читаемой форме или избежать двойного отрицания.