Справочник по Python · модуль 2 · условия
Глава 2.5
Вложенные условия
(nested if)
Иногда вторую проверку имеет смысл выполнять только после успешной первой. Тогда один if помещают внутрь другого и получают два уровня решения.
- Категория
- Управление выполнением
- Уровень
- Начальный
- Связанные темы
- if, else, составные условия
- Зачем это знать
- Строить последовательные зависимые проверки
§1Зависимые проверки
Вложенное условие — это if внутри блока другого if. Внутренняя проверка запускается только тогда, когда программа вошла во внешнюю ветку.
Например, билет имеет смысл проверять только после проверки возраста. Если возраст не подходит, до вопроса о билете программа не доходит.
§2Общий синтаксис
if условие_1: if условие_2: действие
Второй if находится внутри первого блока и получает ещё один уровень отступа. Действие внутри второго if имеет восемь пробелов относительно начала строки.
§3Как выполняется код
age = 20 has_ticket = True if age >= 18: if has_ticket: print("Вход разрешён")
- Проверяется
age >= 18. - Если результат
True, проверяетсяhas_ticket. - Сообщение выводится, только если обе проверки истинны.
При age = 17 внутренняя проверка не запускается. При age = 20 и has_ticket = False она запускается, но её блок пропускается.
§4К какому if относится else
else относится к тому if, с которым стоит на одном уровне отступа.
if age >= 18: if has_ticket: print("Вход разрешён") else: print("Нет билета")
Здесь else выровнен со вторым if, поэтому сообщает об отсутствии билета. Он ничего не делает для случая неподходящего возраста.
§5Разные варианты вложения
Внутренние и внешние ветки else
age = 20 has_ticket = False if age >= 18: if has_ticket: print("Вход разрешён") else: print("Нет билета") else: print("Вход закрыт по возрасту")
Нет билета
Внешний else выровнен с первым if, а внутренний — со вторым. По отступам видно, какую проверку дополняет каждая ветка.
Вложенный if внутри else
Внутренняя проверка может находиться не только в ветке if, но и в ветке else. Тогда до неё программа доходит лишь после ложного внешнего условия.
balance = 300 price = 500 has_discount = True if balance >= price: print("Можно купить") else: print("Обычной суммы недостаточно") if has_discount: print("Проверьте цену со скидкой")
Обычной суммы недостаточно Проверьте цену со скидкой
Если бы денег хватало, выполнился бы первый блок, а has_discount вообще не проверялся бы.
Цепочка if / elif / else внутри if
Внутри внешней ветки можно выбрать один из нескольких вариантов с помощью elif.
is_logged_in = True role = "editor" if is_logged_in: if role == "admin": print("Все настройки доступны") elif role == "editor": print("Можно изменять материалы") else: print("Доступ только для чтения") else: print("Сначала войдите в систему")
Можно изменять материалы
Сначала решается вопрос о входе. Только после этого внутренняя цепочка выбирает один вариант по роли.
Действие между двумя проверками
Внешний блок может содержать свои действия до внутреннего if. Это один из случаев, когда вложение точнее передаёт ход программы, чем одно условие с and.
age = 20 has_ticket = False if age >= 18: print("Возраст подходит") if has_ticket: print("Вход разрешён") else: print("Нужен билет")
Возраст подходит Нужен билет
§6Вложение или and
Если действие одно и обе проверки равноправны, вложение можно заменить оператором and.
| Вложение | Составное условие |
|---|---|
if age >= 18: | if age >= 18 and has_ticket: |
Вложение нужно, когда после первой проверки появляются отдельные действия или разные ответы. Если требуется только один общий результат, составное условие обычно читается проще.
§7Правила отступов
- каждый новый уровень
ifдобавляет четыре пробела; elseвыравнивается с темif, который он дополняет;- не смешивайте табуляцию и пробелы;
- если уровней стало больше двух-трёх, разделите задачу на более простые проверки.
Сначала разберите внешнюю проверку, не читая внутренний блок. Затем разберите тот путь, по которому программа вошла внутрь.
§8Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
внутренний if без дополнительного отступа | он станет отдельной проверкой, не зависящей от внешней | добавить четыре пробела |
else выровнен не с тем if | сообщение появится для другого случая | проверить уровни отступов |
нет действия внутри второго if | IndentationError | добавить блок или временно написать pass |
| четыре-пять уровней вложения | путь выполнения трудно проследить | разделить условие на несколько более простых проверок |
два вложенных if для одного действия | код длиннее необходимого | рассмотреть условие с and |
§9Проверьте себя
Когда проверяется внутренний if?
Только после того, как программа вошла в блок внешнего if.
Как определить, к какому if относится else?
По отступу: else стоит на одном уровне со своим if.
Можно ли заменить два вложенных условия одним and?
Да, если нужно выполнить одно действие только при истинности обеих проверок. Если после первой проверки есть отдельные действия, вложение оставляют.
§10Шпаргалка
if first: if second: if second: ... else:if first: ...else:if first and second:Итог главы
Вложенный if создаёт зависимую проверку: внутреннее условие рассматривается только после успешного внешнего. Уровни задаются отступами, а каждый else относится к if на той же позиции. Для одного общего действия два условия часто можно соединить через and.