До сих пор все ваши условия выбирали из двух вариантов: если истина — одно, если ложь — другое. Но в жизни редко бывает только два пути. У школьной оценки не два уровня, а пять. У возрастной группы не «ребёнок или взрослый», а несколько ступеней. Можно, конечно, засунуть один if внутрь другого и получить лестницу из вложенных условий, но читать такой код тяжело, а ошибиться в отступах — легко. В этом уроке разберём инструмент, который решает задачу «выбрать один вариант из многих» аккуратно, и заодно разберёмся, в каком порядке Python вообще проверяет такие цепочки.
Когда одного if-else мало
Представьте приёмную комиссию, которая распределяет абитуриентов по потокам по результатам экзамена. Не «прошёл или не прошёл», а сразу несколько групп: отличники, хорошисты, те, кому нужен пересдача, и те, кто не набрал минимум. Раскладывать людей по такому множеству ящиков одним if-else неудобно — вариантов больше двух.
Официально дополнительное условие в такой цепочке называется elif — сокращение от else if, то есть «иначе если». Блоков elif в одной цепочке может быть сколько угодно, и добавляются они между if и необязательным else.
score = 85
if score >= 90:
grade = "Отлично"
elif score >= 80:
grade = "Хорошо"
elif score >= 60:
grade = "Удовлетворительно"
else:
grade = "Неудовлетворительно"
print(grade)
Разберём, что здесь происходит, по частям:
if score >= 90:— первая проверка, как обычныйif, который вы уже знаете.elif score >= 80:— «иначе, если balла хотя бы 80». Эта строка проверяется только тогда, когда условие выше оказалось ложным.elif score >= 60:— ещё одна запасная проверка, тоже начинается с двоеточия и требует отступа для своего блока, как иif.else:— вариант на все случаи, которые не подошли ни под одно условие выше.print(grade)— уже знакомый вызов функции печати переменной.
При score = 85 первое условие 85 >= 90 ложно, а второе 85 >= 80 истинно, поэтому переменная grade получает значение "Хорошо", и программа печатает именно его.
Как Python проверяет условия по порядку
Вернёмся к приёмной комиссии. Сотрудник не смотрит сразу на все ящики одновременно — он берёт анкету и проверяет условия одно за другим, сверху вниз, пока не найдёт первое подходящее. Как только нашёл — кладёт анкету в этот ящик и переходит к следующему человеку, не проверяя оставшиеся условия.
Так же работает и цепочка if-elif-else в Python. Официально это поведение называют остановкой на первом истинном условии. Алгоритм такой:
- Python проверяет условие в
if. Если оноTrue— выполняет этот блок и выходит из всей цепочки. - Если
False— переходит к первомуelifи проверяет его условие. - Так продолжается для каждого следующего
elif, пока не найдётся истинное условие. - Если ни одно условие не подошло — выполняется
else(если он есть).
age = 35
if age < 13:
group = "Ребёнок"
elif age < 18:
group = "Подросток"
elif age < 60:
group = "Взрослый"
else:
group = "Пенсионер"
print(group)
Проследим шаг за шагом, что делает Python при age = 35:
age < 13—35 < 13этоFalse, идём дальше.age < 18—35 < 18тожеFalse, идём дальше.age < 60—35 < 60этоTrue. Python присваиваетgroup = "Взрослый"и сразу выходит из цепочки.- Строка
elseуже не проверяется и не выполняется — до неё дело не дошло.
Обратите внимание на важную деталь: во втором условии мы пишем просто age < 18, а не 13 <= age < 18. Это работает, потому что к моменту проверки этого elif Python уже знает: первое условие age < 13 было ложным, а значит, возраст точно не меньше 13. Повторять эту границу не нужно — она уже учтена самим порядком цепочки.
В любой момент времени выполняется РОВНО один блок из всей цепочки if-elif-else — тот, чьё условие оказалось истинным первым. Все остальные блоки Python даже не смотрит.
Порядок условий имеет значение
Раз Python останавливается на первом истинном условии, порядок, в котором вы пишете elif, становится критически важным. Посмотрите на этот код и попробуйте понять ошибку до объяснения:
score = 95
if score >= 60:
grade = "Удовлетворительно"
elif score >= 80:
grade = "Хорошо"
elif score >= 90:
grade = "Отлично"
print(grade)
При score = 95 эта программа напечатает Удовлетворительно, хотя результат явно отличный. Разбор по строкам:
score >= 60— условие95 >= 60истинно. Оно верно вообще для любого балла от 60 и выше, включая 80, 90 и 95.- Так как это первое условие в цепочке и оно уже истинно, Python выполняет его блок и сразу выходит.
- До
elif score >= 80иelif score >= 90дело просто не доходит — они физически не могут сработать ни при каком балле.
Когда условия проверяют числовой диапазон через >= или <=, ставьте самое строгое (то есть с наибольшим порогом) условие первым, а более мягкое — ниже. Иначе широкое условие «перехватит» все случаи, которые должны были достаться следующим блокам.
score = 95
if score >= 90:
grade = "Отлично"
elif score >= 80:
grade = "Хорошо"
elif score >= 60:
grade = "Удовлетворительно"
print(grade)
Теперь строгое условие score >= 90 проверяется первым, оно истинно при score = 95, и программа верно печатает Отлично.
elif — это не то же самое, что несколько if подряд
Частый вопрос новичков: а зачем вообще писать elif, если можно просто написать несколько if один за другим? Разница принципиальная, и её стоит увидеть на коде.
Несколько отдельных if — это независимые проверки: Python оценивает каждую из них, не обращая внимания на то, что произошло в предыдущей. Цепочка if-elif — это, наоборот, набор взаимоисключающих вариантов: сработает только один из них.
score = 95
if score >= 90:
print("Отлично")
if score >= 80:
print("Хорошо")
if score >= 60:
print("Удовлетворительно")
Здесь три самостоятельных оператора if, и при score = 95 истинны все три условия сразу — поэтому на экран выведутся все три строки подряд: Отлично, Хорошо и Удовлетворительно. Каждый if не знает о существовании соседних.
score = 95
if score >= 90:
print("Отлично")
elif score >= 80:
print("Хорошо")
elif score >= 60:
print("Удовлетворительно")
А здесь все три проверки объединены в одну цепочку через elif. Условие score >= 90 истинно, печатается Отлично, и на этом цепочка заканчивается — остальные два elif даже не проверяются, поэтому на экране будет только одна строка.
Если варианты взаимоисключающие и подходит только один — используйте elif. Если проверки независимы и могут сработать вместе — пишите отдельные if.
Частые ошибки
Самая частая ловушка — широкое условие поставлено раньше узкого, как в примере выше. Проверяйте цепочку с числовыми диапазонами сверху вниз: от самого строгого порога к самому мягкому.
Если написать новый if с отступом внутри блока предыдущего if вместо elif на том же уровне, получится совсем другая логика — вложенное условие проверяется только внутри первого блока, а не как самостоятельная альтернатива. Сверяйте отступы: elif должен начинаться с той же позиции, что и его if.
Как и if, строка elif условие: обязательно заканчивается двоеточием, а её блок — это следующие строки с отступом в 4 пробела. Без двоеточия Python выдаст SyntaxError, без отступа у блока — IndentationError.
Если в цепочке нет else и ни одно условие не оказалось истинным, ни один блок не выполнится вообще, и переменная, которую вы хотели туда записать, останется несозданной. Обращение к ней ниже по коду даст NameError. Если нужен гарантированный результат на все случаи — добавляйте else.
Что важно запомнить
Проверьте себя
4 вопроса
Оценка по баллам
Дана переменная score = 85. Используйте if-elif-else, чтобы присвоить переменной grade:
"Отлично"еслиscore >= 90"Хорошо"еслиscore >= 80"Удовлетворительно"еслиscore >= 60"Неудовлетворительно"иначе
Выведите grade через print().
Возрастные группы
Дана переменная age = 35. Используйте if-elif-else, чтобы присвоить переменной group:
"Ребёнок"еслиage < 13"Подросток"еслиage < 18"Взрослый"еслиage < 60"Пенсионер"иначе
Выведите group через print().
Время года по номеру месяца
Дана переменная month — номер месяца от 1 до 12 (month = 8). Определите время года и сохраните его в переменную season:
"Зима"— декабрь, январь, февраль (месяцы 12, 1, 2)"Весна"— март, апрель, май (3, 4, 5)"Лето"— июнь, июль, август (6, 7, 8)"Осень"— сентябрь, октябрь, ноябрь (9, 10, 11)
Выведите season через print(). Например, при month = 8 должно получиться Лето.
Подсказка: декабрь (12) удобно проверить отдельным условием в самом начале, а для остальных месяцев использовать сравнения вида month <= 2, month <= 5 и так далее -- как в разборе с оценками по баллам в этом уроке.
Тариф такси по расстоянию
Служба такси считает стоимость поездки по расстоянию distance (в целых километрах, distance = 7) по правилам:
- первые 2 км стоят фиксированно
150рублей; - если расстояние больше 2, но не больше 10 км —
150плюс40рублей за каждый километр сверх первых двух; - если расстояние больше 10 км —
150плюс40рублей за каждый из километров со 2 по 10 (то есть плюс320), плюс55рублей за каждый километр сверх десяти.
Сохраните итоговую стоимость в переменную price и выведите её через print(). Например, при distance = 2 должно получиться 150.