elif в Python: несколько условий без путаницы
Автор: Казачкин Даниил Михайлович · Обновлено
Цепочка if–elif–else выбирает первый подходящий вариант. Условия проверяются сверху вниз; после истинного условия его блок выполняется, а остальные ветки пропускаются. Поэтому порядок проверок является частью алгоритма, а не вопросом оформления.
Диапазоны без пересечения
score = 76
if score >= 85:
grade = 'отлично'
elif score >= 60:
grade = 'хорошо'
elif score >= 40:
grade = 'нужно повторить'
else:
grade = 'тема не освоена'
print(grade)Для 76 вывод будет:
хорошоВторая ветка не обязана писать верхнюю границу 84: до неё программа дошла только после ложного score >= 85. Условия образуют последовательное сито.
Почему широкая проверка должна быть ниже
Если первой поставить score >= 40, то значения 60 и 90 сразу попадут в эту ветку, а более точные варианты станут недостижимыми. Для возраста и размеров часто удобно идти от большего порога к меньшему. Для отдельных строковых команд порядок может быть произвольным, если варианты не пересекаются.
Несколько независимых if ведут себя иначе: истинными могут оказаться сразу несколько условий. Используйте их, только когда действия должны накапливаться. В классификации одной оценки нужна единая цепочка.
Таблица перед кодом
Напишите классификатор температуры: ниже 0 — «мороз», от 0 до 14 — «холодно», от 15 до 24 — «тепло», от 25 — «жарко». До написания составьте тесты -1, 0, 14, 15, 24 и 25. После запуска отметьте, какая ветка обрабатывает каждую границу. Дополнительно уберите else и посмотрите, что произойдёт с переменной результата для непокрытого случая: это покажет пользу полного набора веток.
Покрытие диапазона
Для классификации возраста нарисуйте интервалы на числовой прямой и только потом расположите elif. Выберите категории до 6, от 7 до 11, от 12 до 17 и от 18 лет. Проверьте значения по обе стороны каждой границы. Добавьте счётчик срабатываний веток в тестовом цикле и убедитесь, что каждое значение получает ровно одну категорию. Затем поменяйте местами две проверки и найдите недостижимую ветку. В итоговом коде удалите диагностику, но сохраните таблицу тестов: она документирует порядок условий лучше, чем длинный комментарий.
Практикум: оценка по непересекающимся диапазонам
Переведите балл от 0 до 100 в категории A, B, C, D и F. Запишите диапазоны так, чтобы они покрывали все допустимые значения без пересечений. Проверьте 0, 59, 60, 69, 70, 79, 80, 89, 90 и 100. Сначала отклоните число вне диапазона, затем применяйте цепочку elif от верхней границы вниз или от нижней вверх. Поменяйте порядок двух веток и найдите тест, где более широкое условие преждевременно перехватывает значение.
Контрольная точка
Почему после истинной ветки остальные elif не проверяются? Используйте это свойство, чтобы объяснить порядок диапазонов и невозможность вывести две оценки одному баллу.
Частые вопросы
Можно ли заменить elif несколькими if?
Можно, если условия действительно независимы и допускают несколько действий. Для одной категории из взаимоисключающих диапазонов цепочка if/elif/else яснее и гарантирует выбор только первой подходящей ветки.