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

Практикум: условия

Собираем if, elif, else, and/or/not, тернарный оператор и match-case в одну практику на реальных задачах.

Практикум~40 минутНовичок

За шесть уроков вы собрали набор инструментов для принятия решений в коде: if, elif, else, логические операторы and, or, not, тернарный оператор и match-case. По отдельности каждый понятен, но на стыке нескольких условий новички чаще всего путаются — забывают порядок веток или перепутывают and с or.

Этот урок — без новой теории. Мы разберём типичные ловушки, которые чаще всего встречаются именно там, где условий несколько, а дальше вы закрепите всё на шести задачах.

Главная идея урока: порядок веток и выбор оператора — это не мелочи оформления, а часть логики программы. Одна и та же задача, записанная в другом порядке или с другим оператором, может дать совсем другой результат.

Ловушка 1. Неправильный порядок веток в elif

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

score = 95

if score >= 60:
    grade = "Сдал"
elif score >= 90:
    grade = "Отлично"
else:
    grade = "Не сдал"

print(grade)
Программа выведет Сдал, хотя 95 баллов — это явно «Отлично». Условие score >= 60 уже истинно при 95, Python выполняет эту ветку и останавливается — до elif score >= 90 дело не доходит. Правило простое: узкие условия пишите раньше широких.

Ловушка 2. and вместо or и наоборот

and требует, чтобы оба условия были истинны одновременно, or — чтобы хотя бы одно. Их путают, когда формулировка на русском звучит похоже, а логика противоположная.

day = "суббота"

if day == "суббота" and day == "воскресенье":
    print("Выходной")
else:
    print("Будний день")
Выведется Будний день — неправильно, ведь суббота выходной. Переменная day не может одновременно равняться и "суббота", и "воскресенье": с and условие всегда ложно. Нужен or: day == "суббота" or day == "воскресенье" — достаточно совпадения хотя бы с одним днём.

Ловушка 3. Тернарный оператор не для сложной логики

Тернарный оператор значение_если_true if условие else значение_если_false отлично заменяет короткий if-else в одну строку. Но когда веток становится больше двух, его пытаются растянуть — и получают нечитаемую кашу вместо аккуратного кода.

temp = 15
weather = "жарко" if temp > 25 else "тепло" if temp > 10 else "холодно"

print(weather)
Код рабочий и выведет тепло: Python читает цепочку справа налево, как вложенные if. Но уже на трёх вариантах строку тяжело понять с первого взгляда. Тернарный оператор оставляйте для двух простых исходов, а при трёх и более ветках пишите обычный if-elif-else.

Ловушка 4. Забытый case _ в match

Если в match ни один case не совпал и нет ветки case _, программа просто ничего не делает — без ошибки, без вывода. Это легко принять за баг где-то в другом месте, хотя на деле не хватает запасной ветки на все остальные случаи.

command = "help"

match command:
    case "start":
        print("Запуск")
    case "stop":
        print("Остановка")

print("Готово")
Выведется только Готово: command = "help" не совпала ни с "start", ни с "stop", а ветки case _ нет. Добавляйте case _, когда входные данные могут оказаться любыми, — например print("Неизвестная команда").

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

В цепочке elif условия проверяются по порядку, и выполняется только первая подошедшая ветка — узкие условия ставьте раньше широких.
and требует истинности обоих условий сразу, or — хотя бы одного. Перед тем как писать оператор, проговорите условие словами и проверьте, какой смысл в него вкладываете.
Тернарный оператор удобен для двух простых исходов в одну строку. Для трёх и более веток читаемее обычный if-elif-else.
В match-case без ветки case _ несовпавшее значение проходит мимо без единой ошибки — добавляйте запасную ветку, если входные данные заранее не известны.
Перед тем как сдавать задачу, проверяйте её не только на «обычном» примере, но и на граничном значении — это чаще всего и есть то место, где условие подводит.

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

4 вопроса

Кто старше

Даны три человека и их возраст: name1 = "Аня", age1 = 17; name2 = "Игорь", age2 = 21; name3 = "Марат", age3 = 19. Определите имя самого старшего и запишите его в переменную oldest. Известно, что все три возраста разные.

Выведите oldest на экран.

Скидка по сумме чека

Дана сумма покупки total = 3500 (в рублях). Скидка зависит от суммы:

  • от 5000 и больше — скидка 15%
  • от 2000 до 4999 — скидка 10%
  • от 1000 до 1999 — скидка 5%
  • меньше 1000 — скидки нет (0%)

Запишите процент скидки в переменную discount, а итоговую сумму после скидки — в переменную final (сумма минус скидка, целым числом). Выведите final.

Конвертер оценки 100 в 5

Дан результат теста в процентах: score = 78. Переведите его в привычную пятибалльную оценку и запишите в переменную grade по правилам:

  • 90 и больше — 5
  • от 75 до 89 — 4
  • от 60 до 74 — 3
  • меньше 60 — 2

Выведите grade на экран.

Четверть координатной плоскости

Даны координаты точки: x = -3, y = 5. Определите, в какой четверти координатной плоскости лежит точка, и запишите номер четверти в переменную quarter:

  • 1 — если x > 0 и y > 0
  • 2 — если x < 0 и y > 0
  • 3 — если x < 0 и y < 0
  • 4 — если x > 0 и y < 0
  • 0 — если точка лежит на одной из осей (хотя бы одна координата равна нулю)

Выведите quarter на экран.

Индекс массы тела с категорией

Даны вес и рост человека: weight = 68 (кг), height = 1.75 (м). Индекс массы тела считается по формуле bmi = weight / height ** 2. Посчитайте bmi, округлив до одного знака после запятой функцией round(), а затем определите категорию и запишите её в переменную category:

  • меньше 18.5 — "Недостаток веса"
  • от 18.5 до 24.9 — "Норма"
  • от 25 до 29.9 — "Избыток веса"
  • 30 и больше — "Ожирение"

Выведите category на экран.

Проверка пароля по трём правилам

Дан пароль password = "Sudo Team". Проверьте три правила и запишите результат каждого в отдельную переменную:

  • has_length — True, если в пароле не меньше 8 символов
  • has_upper — True, если в пароле есть хотя бы одна заглавная буква (используйте сравнение password != password.lower())
  • no_spaces — True, если в пароле нет пробелов (используйте password.count(" ") == 0)

Затем запишите в is_valid результат проверки всех трёх правил сразу, а в message — "Пароль подходит", если is_valid равно True, иначе "Пароль не подходит". Выведите message.