Условный оператор в Python: задачи с проверкой ввода
Условный оператор if в Python выполняет блок команд, когда условие истинно; elif позволяет проверить следующие варианты, а else задаёт действие для остальных случаев. После условия ставят двоеточие, команды блока пишут с одинаковым отступом. Ввод через input() сначала является строкой, поэтому для числовой задачи его нужно преобразовать и проверить: int() может вызвать ValueError, а успешно прочитанное число может оказаться вне допустимого диапазона. Надёжная учебная программа отдельно обрабатывает ошибку формата, проверяет ограничения задачи и только затем выбирает нужную ветку решения.
Содержание
Как работает if, elif и else
Начнём с переменной, уже содержащей число. Программа сравнивает его с нулём и выводит одно из трёх сообщений. Отступы показывают, какие команды относятся к каждой ветке.
x = -4
if x > 0:
print("Положительное")
elif x < 0:
print("Отрицательное")
else:
print("Ноль")
Сначала проверяется x > 0. Для −4 это ложь, поэтому первая команда print не выполняется. Затем проверяется x < 0: условие истинно, выводится «Отрицательное». После найденной истинной ветки остальные части этой цепочки пропускаются.
Если x = 0, оба сравнения ложны, поэтому выполняется else. У else нет собственного условия. Можно написать if без elif и без else, если действие требуется только в одном случае. В цепочке допускается несколько elif, но else, если нужен, располагается в конце.
Официальное описание конструкции есть в руководстве Python. Для учебных задач достаточно понять последовательность проверок и роль отступов; заучивание английских названий без исполнения примера мало помогает.
Присваивание и сравнение — разные действия
Один знак равенства присваивает значение переменной: x = 5. Два знака сравнивают значения: x == 5. В условии обычного сравнения нужен второй вариант. Для неравенства пишут !=, для границ — <, >, <= и >=.
Полезно сначала проговорить условие словами, а затем записать его. Это помогает выбрать, нужно ли включать граничное значение.
| Условие словами | Запись Python | Что происходит на границе |
|---|---|---|
| x строго больше 5 | x > 5 |
При x = 5 ложно |
| x не меньше 5 | x >= 5 |
При x = 5 истинно |
| x равно 5 | x == 5 |
Истинно только для 5 |
| x не равно 5 | x != 5 |
При x = 5 ложно |
| x от 5 до 10 включительно | 5 <= x <= 10 |
5 и 10 подходят |
Для проверки двух требований одновременно используют and, для выбора хотя бы одного — or, для отрицания — not. Например, x < 5 or x > 10 проверяет, что число находится вне отрезка от 5 до 10. Операторы подробнее разобраны в документации встроенных типов.
Не пишите x == 5 or 10, если хотите проверить равенство 5 или 10. Выражение после or должно быть отдельным сравнением: x == 5 or x == 10. В неправильном варианте число 10 само считается истинным значением, и условие фактически всегда проходит.
Почему input() ещё не даёт число
Вызов input() читает строку. Если пользователь ввёл 12, программа получила текст "12", а не целое число 12. Поэтому выражение input() + input() соединяет строки: ввод 2 и 3 даст "23", а не 5.
Для целого числа используют int(). В документации input() и int() описаны чтение строки и преобразование. В простом школьном задании можно написать x = int(input()), если условие гарантирует правильный ввод. Но программа с проверкой должна учитывать неправильный формат.
Строки "7", "-3" и " 12 " преобразуются в целые числа. Строки "семь", "2.5", "2,5" и пустая строка не подходят для int() и вызывают ValueError. Число с дробной частью нельзя молча заменить целым, если задача требует именно целое значение.
При самостоятельной тренировке задавайте понятные ограничения: «Введите целое число от 0 до 20». Это точнее, чем приглашение «Введите число», после которого программа неожиданно отказывается принимать 2,5.
Первый полный пример: знак числа с обработкой ошибки
В этом примере try содержит преобразование ввода. Если int() не может прочитать целое число, выполняется except ValueError. Блок else после try выполняется только при успешном завершении try. Уже внутри него if выбирает сообщение о знаке.
try:
x = int(input("Введите целое число: "))
except ValueError:
print("Нужно ввести целое число, например -3, 0 или 12.")
else:
if x > 0:
print("Положительное")
elif x < 0:
print("Отрицательное")
else:
print("Ноль")
Здесь два разных else. Первый расположен на уровне try и относится к успешному преобразованию. Второй находится глубже, на уровне if, и относится к числу, которое не больше и не меньше нуля. Отступы позволяют различить их назначение.
Если введено «кот», выполняется сообщение об ошибке формата. Сравнения x с нулём не запускаются. Если введён −3, преобразование успешно и программа выводит «Отрицательное». Повторный запрос здесь не предусмотрен: для него нужен цикл, который можно добавить отдельным этапом.
Ловите конкретную ожидаемую ошибку ValueError, а не все возможные исключения одной пустой командой except. Так опечатка в имени переменной не будет ошибочно представлена пользователю как неправильный ввод.
Второй пример: оценка результата по диапазонам
Пусть учебный тест содержит 20 заданий. Число правильных ответов должно быть целым от 0 до 20. По условию нашей задачи 17–20 ответов дают сообщение «Высокий результат», 10–16 — «Есть основа для дальнейшей тренировки», 0–9 — «Нужно повторить тему». Это условная тренировочная шкала, а не правило выставления школьной отметки.
try:
score = int(input("Правильных ответов от 0 до 20: "))
except ValueError:
print("Введите целое число.")
else:
if not 0 <= score <= 20:
print("Число должно быть от 0 до 20.")
elif score >= 17:
print("Высокий результат")
elif score >= 10:
print("Есть основа для дальнейшей тренировки")
else:
print("Нужно повторить тему")
Сначала проверяется диапазон. Это необходимо: без такой ветки число 100 тоже удовлетворяет score >= 17 и получает неподходящее сообщение. Только после подтверждения диапазона имеет смысл выбирать результат.
Порядок elif идёт от более высокого порога к низкому. Если сначала поставить score >= 10, число 18 попадёт в эту ветку, и проверка score >= 17 уже не выполнится. Когда условия перекрываются, более узкую группу нужно проверить раньше либо записать непересекающиеся интервалы.
Для самопроверки возьмите значения вокруг границ. Эти случаи обнаруживают ошибки со строгими сравнениями и порядком веток лучше, чем один обычный пример.
| Ввод | Ожидаемое сообщение |
|---|---|
| −1 | Число должно быть от 0 до 20 |
| 0, 9 | Нужно повторить тему |
| 10, 16 | Есть основа для дальнейшей тренировки |
| 17, 20 | Высокий результат |
| 21 | Число должно быть от 0 до 20 |
abc, 2.5, пустая строка |
Введите целое число |
Каждый элемент в ячейке — отдельный запуск программы. Не вводите «0, 9» одной строкой: программа ожидает одно целое число, а не список значений.
Третий пример: можно ли вычислить площадь
У прямоугольника длина и ширина должны быть положительными. Для учебной задачи примем, что обе величины задаются целыми числами сантиметров. Нулевую или отрицательную сторону считаем недопустимым вводом.
try:
length = int(input("Длина в целых сантиметрах: "))
width = int(input("Ширина в целых сантиметрах: "))
except ValueError:
print("Обе стороны нужно задать целыми числами.")
else:
if length <= 0 or width <= 0:
print("Длина и ширина должны быть больше нуля.")
else:
area = length * width
print("Площадь:", area, "см²")
Условие ошибки соединено через or: достаточно хотя бы одной неположительной стороны, чтобы площадь по правилам задачи не вычислялась. Проверка через and была бы ошибочной: пара 0 и 5 прошла бы дальше, хотя первая сторона недопустима.
При вводе 3 и 5 результат равен 15 см². При вводе −3 и 5 программа сообщает об ограничении. При вводе «два» в первой строке возникает ValueError, и вторая строка в этом запуске уже не запрашивается: управление сразу переходит к except.
Эта программа не предназначена для любых вещественных измерений. Если условие допускает дробные сантиметры, нужно отдельно выбрать формат ввода и преобразование, например float(), а также уточнить обработку десятичной точки. Менять int() на float() без пересмотра требований задачи недостаточно.
Цепочка elif и несколько отдельных if
Цепочка if–elif–else выбирает не более одной ветки. Несколько отдельных if проверяются независимо и могут выполнить несколько действий. Выбирайте структуру по смыслу задачи, а не по привычке.
Предположим, число 12 нужно описать по двум независимым признакам. Обе проверки должны сработать, поэтому два отдельных if здесь подходят.
x = 12
if x > 0:
print("Число положительное")
if x % 2 == 0:
print("Число чётное")
Программа выводит два сообщения. Оператор % находит остаток от деления; равенство остатку 0 при делении целого числа на 2 означает чётность. Если заменить второй if на elif, при положительном x проверка чётности окажется пропущена.
Для выбора одной категории, например «отрицательное», «ноль», «положительное», цепочка elif удобнее. Она прямо показывает, что ветки являются альтернативами. Если записать отдельные if с неудачно перекрывающимися условиями, можно получить противоречивые сообщения.
Как проверять программу по шагам
Перед запуском составьте короткую таблицу: ввод, ожидаемая ветка, ожидаемый вывод. После запуска сравните результат с таблицей. Если ожидание записано заранее, труднее принять любой появившийся текст за правильный ответ.
Для каждой границы проверьте значение ниже неё, само значение и значение выше. Для порога 10 это 9, 10, 11. Для допустимого диапазона 0–20 добавьте −1 и 21. Не забудьте случаи ошибки формата: буквы, пустую строку и дробное число, если принимаются только целые.
Ошибки удобно различать по их причине. SyntaxError означает, что запись программы нарушает синтаксис: например, пропущено двоеточие. Ошибка отступов связана со структурой блоков. ValueError при int() сообщает, что строка не преобразуется в целое число. Неверный вывод при успешном запуске обычно требует проверить условия и порядок веток.
Не исправляйте всё сразу. Сначала добейтесь запуска, затем проверьте преобразование ввода, потом ограничения, после этого границы веток. Так можно понять, какая правка действительно устранила проблему.
Задачи для самостоятельной работы
В каждой задаче сначала сформулируйте допустимый ввод и ожидаемые сообщения. Затем напишите программу. Для задач с input() добавьте обработку ValueError и проверку ограничений, если они указаны.
- Прочитайте целое число и выведите «Чётное» или «Нечётное».
- Прочитайте номер месяца от 1 до 12. Для 12, 1 и 2 выведите «Зима», для 3–5 — «Весна», для 6–8 — «Лето», для 9–11 — «Осень». Остальные целые числа отклоните.
- Прочитайте два целых числа. Выведите большее, а при равенстве — «Числа равны».
- Для результата теста перепишите проверки так, чтобы использовались явные интервалы 17–20, 10–16 и 0–9. Сохраните проверку неправильного ввода.
- Прочитайте целое число x и проверьте, находится ли оно на отрезке от −5 до 5 включительно.
- Найдите ошибку в условии
if x == 2 or 3:и запишите исправление. - Что выведут два независимых if из примера для x = 0? А для x = −3?
- Для прямоугольника составьте не менее пяти проверок, включая правильный расчёт, ноль, отрицательную сторону и ошибку формата.
Не открывайте ответы, пока не выбраны хотя бы два контрольных ввода к каждой задаче. Результат программы должен совпасть с вашим ручным разбором этих случаев.
Подсказки и ответы
Ниже приведены ключевые условия и контрольные результаты. Они помогают сверить решение, сохраняя самостоятельную работу над чтением ввода, сообщениями и структурой программы.
- После успешного преобразования проверьте
x % 2 == 0. Ноль и −4 чётные, −3 нечётное. Ограничение только положительными числами условием не задано. - Сначала отклоните
month < 1 or month > 12. Зиму проверяйте черезmonth == 12 or month <= 2; это условие используется после проверки диапазона. Затемmonth <= 5,month <= 8, иначе осень. Контрольные значения: 0 — ошибка диапазона, 2 — зима, 3 — весна, 6 — лето, 9 — осень, 12 — зима, 13 — ошибка диапазона. - Сравните
a > b, затемa < b, иначе значения равны. Для 4 и 9 ответ 9; для −2 и −7 ответ −2; для 5 и 5 сообщение о равенстве. - Условия интервалов:
17 <= score <= 20,10 <= score <= 16,0 <= score <= 9. После начальной проверки диапазона последнюю группу можно оставить как else. - Подходит
-5 <= x <= 5. Значения −5, 0 и 5 внутри; −6 и 6 снаружи. - Нужно
if x == 2 or x == 3:. Исходное выражение содержит самостоятельный операнд 3, который считается истинным независимо от x. - При x = 0 выводится только «Число чётное». При x = −3 не выводится ни одно сообщение: число не положительное и нечётное.
- Например: 3 и 5 → площадь 15; 1 и 1 → площадь 1; 0 и 5 → ошибка диапазона; 3 и −5 → ошибка диапазона; 3 и
abc→ ошибка формата. Дополнительно проверьте пустую строку и2.5.
Проверочный список готового решения
Перед сдачей прочитайте код сверху вниз как последовательность действий. Проверьте не только счастливый случай, но и входные данные, для которых вычисление должно остановиться.
- После if и elif стоят условия и двоеточия; после else — двоеточие.
- Команды одного блока имеют одинаковый отступ, обычно четыре пробела.
- Для сравнения используется
==, для присваивания —=. - Ввод преобразуется в нужный тип до числовых сравнений.
- Ошибка формата и нарушение диапазона получают отдельные понятные сообщения.
- Порядок веток не скрывает более узкое условие за широким.
- Использование and и or соответствует смыслу требований.
- Проверены границы, ноль, отрицательные числа и неправильная строка, когда они важны.
Хорошая программа позволяет объяснить, почему выбрана каждая ветка. Если это объяснение не удаётся, вернитесь к условию задачи и запишите правила словами: после этого код обычно становится короче и яснее.