Вложенные условия
Вложенные условия
Вы уже знаете, как проверить одно условие с помощью 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 в одну строку.