Вложенные условия

Вложенные условия

Вы уже знаете, как проверить одно условие с помощью if/elif/else. Но в реальных задачах часто нужна многоуровневая логика: «если пользователь авторизован — проверить роль; если роль администратора — показать панель управления; иначе — стандартный интерфейс». Для таких ситуаций используются вложенные условияif внутри другого if.

Синтаксис вложенных условий

Тело любого блока if/else/elif может содержать другие блоки if. Каждый новый уровень вложенности добавляет 4 пробела отступа:

is_logged_in = True
is_admin = True

if is_logged_in:
    print("Пользователь авторизован")
    if is_admin:
        print("Доступ к панели администратора")
    else:
        print("Обычный пользователь")
else:
    print("Необходимо войти в систему")

Здесь внешний if проверяет авторизацию. Только если пользователь авторизован, выполняется внутренний if — проверка роли. Это логическая последовательность: сначала общее условие, потом частное.

Когда использовать вложенность, а когда and

Часто вложенное условие можно заменить одним условием с and. Оба варианта дают одинаковый результат:

age = 20
has_ticket = True

# Вариант 1: вложенные if
if age >= 18:
    if has_ticket:
        print("Вход разрешён")
    else:
        print("Нет билета")
else:
    print("Возраст не позволяет")

# Вариант 2: and
if age >= 18 and has_ticket:
    print("Вход разрешён")
elif age >= 18:
    print("Нет билета")
else:
    print("Возраст не позволяет")

Правило: если оба условия должны быть истины и при этом нужно разное сообщение для каждого провала — вложенность уместна. Если достаточно одного общего сообщения — and лаконичнее.

Пример: классификатор числа

n = int(input("Введите число: "))

if n > 0:
    if n % 2 == 0:
        print("Положительное чётное")
    else:
        print("Положительное нечётное")
elif n < 0:
    print("Отрицательное")
else:
    print("Ноль")

Внешний if/elif/else определяет знак числа. Для положительных чисел внутренний if/else дополнительно проверяет чётность.

Глубина вложенности и читаемость

Технически Python допускает бесконечную вложенность. Практически — чем глубже вложенность, тем тяжелее читать код. Три уровня вложенности — уже сигнал, что стоит пересмотреть структуру.

# Три уровня — уже сложновато:
if condition1:
    if condition2:
        if condition3:
            do_something()

Один из способов снизить вложенность — ранний выход (early return): если что-то идёт не так, сразу завершить работу. Мы вернёмся к этому приёму в модуле 8, когда изучим функции. Пока просто имейте в виду: если код уходит вправо больше чем на три уровня — стоит задуматься об упрощении.

Практический пример: система скидок

is_member = True
total_price = 1500

if is_member:
    if total_price >= 2000:
        discount = 0.20   # 20% для членов клуба при сумме >= 2000
    elif total_price >= 1000:
        discount = 0.10   # 10% для членов клуба при сумме >= 1000
    else:
        discount = 0.05   # 5% для всех членов клуба
else:
    if total_price >= 3000:
        discount = 0.05   # 5% для обычных покупателей при большой сумме
    else:
        discount = 0.0    # без скидки

final_price = total_price * (1 - discount)
print(f"Скидка: {int(discount * 100)}%")
print(f"Итого: {final_price:.0f} руб.")

Здесь логика требует именно вложенности: поведение зависит от двух независимых факторов (членство и сумма), которые создают разные сценарии.

Типичная ошибка: неверный отступ

Самая частая ошибка с вложенными условиями — неправильно расставить отступы, из-за чего else «привязывается» не к тому if:

x = 5
y = 10

if x > 0:
    if y > 0:
        print("оба положительные")
else:
    print("x не положительный")   # этот else — для внешнего if!

В Python else всегда относится к ближайшему if на том же уровне отступа. Если хочется else для внутреннего if, нужно соблюдать соответствующий отступ:

if x > 0:
    if y > 0:
        print("оба положительные")
    else:
        print("x > 0, но y <= 0")   # относится к if y > 0
else:
    print("x не положительный")     # относится к if x > 0

Проверь себя

Что выведет следующий код?

a = 5
b = -3

if a > 0:
    if b > 0:
        print("оба плюс")
    else:
        print("a плюс, b минус")
else:
    print("a не плюс")

a = 5 > 0 → True → входим во внешний блок. b = -3 > 0 → False → else внутреннего → "a плюс, b минус".

Итог

  • Вложенные условия — это if внутри другого if; каждый уровень добавляет 4 пробела.
  • Используйте вложенность, когда внутреннее условие проверяется только при истинности внешнего.
  • Можно часто заменить вложенность на and, если нет необходимости в разных сообщениях для каждого провала.
  • else привязывается к ближайшему if на том же уровне отступа — следите за отступами.
  • Избегайте вложенности более трёх уровней: это сигнал, что код нужно упростить.

В следующем уроке познакомимся с тернарным выражением — компактным способом записать if/else в одну строку.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике