Модуль 2 · Условия

Справочник по Python · модуль 2 · условия

Глава 2.5

2.5

Вложенные условия
(nested if)

Иногда вторую проверку имеет смысл выполнять только после успешной первой. Тогда один if помещают внутрь другого и получают два уровня решения.

Категория
Управление выполнением
Уровень
Начальный
Связанные темы
if, else, составные условия
Зачем это знать
Строить последовательные зависимые проверки

§1Зависимые проверки

Вложенное условие — это if внутри блока другого if. Внутренняя проверка запускается только тогда, когда программа вошла во внешнюю ветку.

Например, билет имеет смысл проверять только после проверки возраста. Если возраст не подходит, до вопроса о билете программа не доходит.

§2Общий синтаксис

Pythonдва уровня
if условие_1:
    if условие_2:
        действие

Второй if находится внутри первого блока и получает ещё один уровень отступа. Действие внутри второго if имеет восемь пробелов относительно начала строки.

§3Как выполняется код

main.pyдоступ по возрасту и билету
age = 20
has_ticket = True

if age >= 18:
    if has_ticket:
        print("Вход разрешён")
  1. Проверяется age >= 18.
  2. Если результат True, проверяется has_ticket.
  3. Сообщение выводится, только если обе проверки истинны.

При age = 17 внутренняя проверка не запускается. При age = 20 и has_ticket = False она запускается, но её блок пропускается.

§4К какому if относится else

else относится к тому if, с которым стоит на одном уровне отступа.

Pythonelse внутреннего условия
if age >= 18:
    if has_ticket:
        print("Вход разрешён")
    else:
        print("Нет билета")

Здесь else выровнен со вторым if, поэтому сообщает об отсутствии билета. Он ничего не делает для случая неподходящего возраста.

§5Разные варианты вложения

Внутренние и внешние ветки else

main.pyвсе варианты ответа
age = 20
has_ticket = False

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

Внешний else выровнен с первым if, а внутренний — со вторым. По отступам видно, какую проверку дополняет каждая ветка.

Вложенный if внутри else

Внутренняя проверка может находиться не только в ветке if, но и в ветке else. Тогда до неё программа доходит лишь после ложного внешнего условия.

main.pyдополнительная проверка после отказа
balance = 300
price = 500
has_discount = True

if balance >= price:
    print("Можно купить")
else:
    print("Обычной суммы недостаточно")
    if has_discount:
        print("Проверьте цену со скидкой")
Выводвнешний if ложен
Обычной суммы недостаточно
Проверьте цену со скидкой

Если бы денег хватало, выполнился бы первый блок, а has_discount вообще не проверялся бы.

Цепочка if / elif / else внутри if

Внутри внешней ветки можно выбрать один из нескольких вариантов с помощью elif.

main.pyроль вошедшего пользователя
is_logged_in = True
role = "editor"

if is_logged_in:
    if role == "admin":
        print("Все настройки доступны")
    elif role == "editor":
        print("Можно изменять материалы")
    else:
        print("Доступ только для чтения")
else:
    print("Сначала войдите в систему")
Выводis_logged_in = True
Можно изменять материалы

Сначала решается вопрос о входе. Только после этого внутренняя цепочка выбирает один вариант по роли.

Действие между двумя проверками

Внешний блок может содержать свои действия до внутреннего if. Это один из случаев, когда вложение точнее передаёт ход программы, чем одно условие с and.

main.pyдействие на каждом уровне
age = 20
has_ticket = False

if age >= 18:
    print("Возраст подходит")

    if has_ticket:
        print("Вход разрешён")
    else:
        print("Нужен билет")
Выводпервый уровень пройден
Возраст подходит
Нужен билет

§6Вложение или and

Если действие одно и обе проверки равноправны, вложение можно заменить оператором and.

ВложениеСоставное условие
if age >= 18:
    if has_ticket:
        print("Вход")
if age >= 18 and has_ticket:
    print("Вход")

Вложение нужно, когда после первой проверки появляются отдельные действия или разные ответы. Если требуется только один общий результат, составное условие обычно читается проще.

§7Правила отступов

  • каждый новый уровень if добавляет четыре пробела;
  • else выравнивается с тем if, который он дополняет;
  • не смешивайте табуляцию и пробелы;
  • если уровней стало больше двух-трёх, разделите задачу на более простые проверки.
Порядок чтения

Сначала разберите внешнюю проверку, не читая внутренний блок. Затем разберите тот путь, по которому программа вошла внутрь.

§8Частые ошибки

Что написаноЧто произойдётКак правильно
внутренний if без дополнительного отступаон станет отдельной проверкой, не зависящей от внешнейдобавить четыре пробела
else выровнен не с тем ifсообщение появится для другого случаяпроверить уровни отступов
нет действия внутри второго ifIndentationErrorдобавить блок или временно написать pass
четыре-пять уровней вложенияпуть выполнения трудно проследитьразделить условие на несколько более простых проверок
два вложенных if для одного действиякод длиннее необходимогорассмотреть условие с and

§9Проверьте себя

Когда проверяется внутренний if?

Только после того, как программа вошла в блок внешнего if.

Как определить, к какому if относится else?

По отступу: else стоит на одном уровне со своим if.

Можно ли заменить два вложенных условия одним and?

Да, если нужно выполнить одно действие только при истинности обеих проверок. Если после первой проверки есть отдельные действия, вложение оставляют.

§10Шпаргалка

Второй уровеньif first: if second:
Внутренний else if second: ... else:
Внешний elseif first: ...else:
Одно действиеif first and second:

Итог главы

Вложенный if создаёт зависимую проверку: внутреннее условие рассматривается только после успешного внешнего. Уровни задаются отступами, а каждый else относится к if на той же позиции. Для одного общего действия два условия часто можно соединить через and.

Глава 2.5 · Вложенные условия · Справочник по Python Автор: Макаров Максим Николаевич