$ sudo teach IT
Модуль 3 · Условия · Урок 3.3

elif: несколько вариантов

Когда одного if-else мало — учимся выстраивать цепочку условий и понимать, в каком порядке Python их проверяет.

Теория + практика~25 минутНовичок

До сих пор все ваши условия выбирали из двух вариантов: если истина — одно, если ложь — другое. Но в жизни редко бывает только два пути. У школьной оценки не два уровня, а пять. У возрастной группы не «ребёнок или взрослый», а несколько ступеней. Можно, конечно, засунуть один if внутрь другого и получить лестницу из вложенных условий, но читать такой код тяжело, а ошибиться в отступах — легко. В этом уроке разберём инструмент, который решает задачу «выбрать один вариант из многих» аккуратно, и заодно разберёмся, в каком порядке Python вообще проверяет такие цепочки.

Видео-урок

Смотреть урок на

Когда одного if-else мало

Представьте приёмную комиссию, которая распределяет абитуриентов по потокам по результатам экзамена. Не «прошёл или не прошёл», а сразу несколько групп: отличники, хорошисты, те, кому нужен пересдача, и те, кто не набрал минимум. Раскладывать людей по такому множеству ящиков одним if-else неудобно — вариантов больше двух.

Официально дополнительное условие в такой цепочке называется elif — сокращение от else if, то есть «иначе если». Блоков elif в одной цепочке может быть сколько угодно, и добавляются они между if и необязательным else.

Python · оценка по баллам
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 (если он есть).
Python · возрастные группы
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, становится критически важным. Посмотрите на этот код и попробуйте понять ошибку до объяснения:

Python · неправильный порядок
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 дело просто не доходит — они физически не могут сработать ни при каком балле.
Правило порядка для диапазонов чисел

Когда условия проверяют числовой диапазон через >= или <=, ставьте самое строгое (то есть с наибольшим порогом) условие первым, а более мягкое — ниже. Иначе широкое условие «перехватит» все случаи, которые должны были достаться следующим блокам.

Python · правильный порядок
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 — это, наоборот, набор взаимоисключающих вариантов: сработает только один из них.

Python · три отдельных if
score = 95

if score >= 90:
    print("Отлично")
if score >= 80:
    print("Хорошо")
if score >= 60:
    print("Удовлетворительно")

Здесь три самостоятельных оператора if, и при score = 95 истинны все три условия сразу — поэтому на экран выведутся все три строки подряд: Отлично, Хорошо и Удовлетворительно. Каждый if не знает о существовании соседних.

Python · цепочка elif
score = 95

if score >= 90:
    print("Отлично")
elif score >= 80:
    print("Хорошо")
elif score >= 60:
    print("Удовлетворительно")

А здесь все три проверки объединены в одну цепочку через elif. Условие score >= 90 истинно, печатается Отлично, и на этом цепочка заканчивается — остальные два elif даже не проверяются, поэтому на экране будет только одна строка.

Как выбирать между elif и несколькими if

Если варианты взаимоисключающие и подходит только один — используйте elif. Если проверки независимы и могут сработать вместе — пишите отдельные if.

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

Неправильный порядок условий

Самая частая ловушка — широкое условие поставлено раньше узкого, как в примере выше. Проверяйте цепочку с числовыми диапазонами сверху вниз: от самого строгого порога к самому мягкому.

elif вместо вложенного if по ошибке

Если написать новый if с отступом внутри блока предыдущего if вместо elif на том же уровне, получится совсем другая логика — вложенное условие проверяется только внутри первого блока, а не как самостоятельная альтернатива. Сверяйте отступы: elif должен начинаться с той же позиции, что и его if.

Забытое двоеточие или отступ у elif

Как и if, строка elif условие: обязательно заканчивается двоеточием, а её блок — это следующие строки с отступом в 4 пробела. Без двоеточия Python выдаст SyntaxError, без отступа у блока — IndentationError.

Переменная не создана, если ни одно условие не подошло

Если в цепочке нет else и ни одно условие не оказалось истинным, ни один блок не выполнится вообще, и переменная, которую вы хотели туда записать, останется несозданной. Обращение к ней ниже по коду даст NameError. Если нужен гарантированный результат на все случаи — добавляйте else.

Что важно запомнить

1
elif добавляет ещё один вариант выбора. Это сокращение от «else if», и таких блоков в одной цепочке может быть сколько угодно.
2
Python останавливается на первом истинном условии. Как только найден подходящий блок — он выполняется, а все условия ниже по цепочке даже не проверяются.
3
Порядок условий для диапазонов чисел важен. Ставьте самое строгое условие первым, иначе широкое условие перехватит случаи, которые должны были достаться следующим блокам.
4
elif — это взаимоисключающие варианты, а не независимые проверки. Несколько отдельных if могут сработать все сразу, а из цепочки elif выполнится только один блок.
5
else в конце цепочки не обязателен. Но без него, если ни одно условие не подошло, переменная может остаться несозданной.
6
elif требует двоеточия и отступа так же, как if. Забытое двоеточие даёт SyntaxError, забытый отступ — IndentationError.

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

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.