Задачник · модуль 2 · Условия

Справочник по Python · задачник · модуль 2

Задачи 2.6

2.6

Задачи к главе
«Тернарный условный оператор»

Когда от условия зависит только одно значение — подпись, ставка, цена, — его выбирают одной строкой: значение if условие else другое_значение. В задачах нужно ещё и решить, где такая запись уместна, а где нужен обычный if.

Глава справочника
2.6 Тернарный условный оператор
Можно использовать
главы 1.1–2.6
Разборов
3 с решением
Практика
15 задач без решения
Уже изучено — этим и решаем

Циклов пока нет — они в модуле 3. Тернарный оператор выбирает одно из двух значений; если вариантов три или в ветке несколько действий, используйте if / elif / else.

§1Разборы: как решать и оформлять

Три задачи решены полностью. В каждой тернарный оператор выбирает значение, а действие с этим значением — расчёт или вывод — записано отдельной строкой.

Разбор 1

Статус заказа

★☆☆базовая

В списке заказов рядом с номером показан статус. Вводятся номер заказа и ответ, оплачен ли он: да или нет. Выведите строку вида Заказ 1054: оплачен или Заказ 1054: ожидает оплаты.

Как рассуждаем

  1. От условия зависит одно значение — текст статуса. Вариантов ровно два. Это случай для тернарного оператора.
  2. Порядок частей: сначала значение для истинного условия, потом if и условие, потом else и второе значение.
  3. Вывод один для обоих случаев: в f-строку подставляется уже выбранный статус.
main.pyрешение
# Ввод
number = int(input("Номер заказа: "))
is_paid = input("Оплачен (да/нет): ") == "да"

# Выбор
status = "оплачен" if is_paid else "ожидает оплаты"

# Вывод
print(f"Заказ {number}: {status}")
Вывод в терминалсиним — то, что ввёл пользователь
Номер заказа: 1054
Оплачен (да/нет): да
Заказ 1054: оплачен

Проверка на других данных

Пример 1
Ввод
1055
нет
Вывод
Заказ 1055: ожидает оплаты
Та же программа через if / else

Без тернарного оператора выбор занял бы четыре строки: if is_paid:, присваивание, else:, второе присваивание. Результат одинаковый. Короткая запись удобнее, когда обе ветки только присваивают значение одной и той же переменной.

Разбор 2

Доставка и итог

★★☆средняя

Доставка стоит 300 рублей, а при заказе от 3000 рублей она бесплатная. Вводится сумма заказа. Выведите стоимость доставки — числом с рублями или словом бесплатно — и итог к оплате.

Как рассуждаем

  1. Стоимость доставки — одно из двух чисел: 0 или 300. Выбираем тернарным оператором.
  2. Итог считаем обычной формулой: выбранное число уже лежит в переменной.
  3. Подпись для вывода тоже одна из двух. Обе ветки дают строку, поэтому число в подпись вставляем через f-строку.
main.pyрешение
# Ввод
order_total = int(input("Сумма заказа, руб.: "))

# Расчёт
delivery = 0 if order_total >= 3000 else 300
final_total = order_total + delivery
delivery_text = "бесплатно" if delivery == 0 else f"{delivery} руб."

# Вывод
print("Доставка:", delivery_text)
print("К оплате:", final_total, "руб.")
Вывод в терминалсиним — то, что ввёл пользователь
Сумма заказа, руб.: 3500
Доставка: бесплатно
К оплате: 3500 руб.

Проверка на других данных

Пример 1
Ввод
1200
Вывод
Доставка: 300 руб.
К оплате: 1500 руб.
Пример 2
Ввод
3000
Вывод
Доставка: бесплатно
К оплате: 3000 руб.
В обеих ветках — значения одного типа

Запись "бесплатно" if delivery == 0 else delivery положила бы в переменную то строку, то число. Программа с такой переменной ломается в неожиданных местах: строку нельзя сложить с числом. Поэтому вторая ветка тоже строка.

Разбор 3

Изменение цены

★★☆средняя

Сервис сравнения цен показывает, как изменилась цена товара. Вводятся вчерашняя и сегодняшняя цена. Выведите разницу со знаком: +150, -80 или 0. Второй строкой выведите вывод словами: Цена выросла, Цена снизилась или Цена не изменилась.

Как рассуждаем

  1. Минус у отрицательного числа выводится сам, а плюс у положительного — нет. Знак перед числом — одно из двух значений: "+" или пустая строка.
  2. Словесных выводов три. Тернарный оператор выбирает из двух значений, поэтому здесь нужна цепочка if / elif / else.
  3. В одной программе используем обе записи — каждую там, где она подходит.
main.pyрешение
# Ввод
yesterday = int(input("Цена вчера, руб.: "))
today = int(input("Цена сегодня, руб.: "))

# Расчёт
diff = today - yesterday
sign = "+" if diff > 0 else ""

# Вывод
print(f"Изменение: {sign}{diff} руб.")
if diff > 0:
    print("Цена выросла")
elif diff < 0:
    print("Цена снизилась")
else:
    print("Цена не изменилась")
Вывод в терминалсиним — то, что ввёл пользователь
Цена вчера, руб.: 1200
Цена сегодня, руб.: 1350
Изменение: +150 руб.
Цена выросла

Проверка на других данных

Пример 1
Ввод
1200
1120
Вывод
Изменение: -80 руб.
Цена снизилась
Пример 2
Ввод
1200
1200
Вывод
Изменение: 0 руб.
Цена не изменилась
Почему не два тернарных оператора подряд

Три варианта можно уместить в одну строку, вложив один тернарный оператор в другой. Такая строка работает, но порядок выбора в ней трудно проследить. Для трёх и более вариантов пишут if / elif / else.

§2Задачи для самостоятельной работы

Решений здесь нет — только условие и примеры, на которых решение нужно проверить. Сложность отмечена звёздами: ★☆☆ — прямое применение главы, ★★☆ — нужно собрать несколько шагов, ★★★ — есть подвох или требуется догадка.

Задача 2.6.1

Чётное или нечётное

★☆☆базовая

Вводится целое число. Выведите Чётное или Нечётное. Выбор слова запишите тернарным оператором.

Примеры для проверки

Пример 1
Ввод
8
Вывод
Чётное
Пример 2
Ввод
15
Вывод
Нечётное
Подсказка

Тернарное выражение можно записать прямо в скобках print().

Задача 2.6.2

Доступ по возрасту

★☆☆базовая

Сайт открывает раздел пользователям от 18 лет. Вводится возраст. Выведите Доступ разрешён или Доступ закрыт.

Примеры для проверки

Пример 1
Ввод
20
Вывод
Доступ разрешён
Пример 2
Ввод
17
Вывод
Доступ закрыт
Пример 3
Ввод
18
Вывод
Доступ разрешён
Подсказка

Сначала значение для истинного условия, потом условие, потом значение для ложного.

Задача 2.6.3

Лучшее предложение

★☆☆базовая

Два покупателя предложили цену за подержанный велосипед. Вводятся два числа. Выведите большее из них.

Примеры для проверки

Пример 1
Ввод
7000
8500
Вывод
Лучшее предложение: 8500 руб.
Пример 2
Ввод
9000
8500
Вывод
Лучшее предложение: 9000 руб.
Пример 3
Ввод
8000
8000
Вывод
Лучшее предложение: 8000 руб.
Подсказка

В ветках тернарного оператора могут стоять переменные.

Задача 2.6.4

Наличие на складе

★☆☆базовая

В карточке товара показано наличие. Вводится остаток на складе. Выведите В наличии, если остаток больше нуля, иначе — Нет в наличии.

Примеры для проверки

Пример 1
Ввод
14
Вывод
В наличии
Пример 2
Ввод
0
Вывод
Нет в наличии
Подсказка

Два варианта подписи — одно условное выражение.

Задача 2.6.5

Отклонение от плана

★☆☆базовая

Вводятся план продаж и фактические продажи. Выведите, на сколько факт отличается от плана, — неотрицательным числом.

Примеры для проверки

Пример 1
Ввод
100
130
Вывод
Отклонение: 30
Пример 2
Ввод
100
85
Вывод
Отклонение: 15
Пример 3
Ввод
100
100
Вывод
Отклонение: 0
Подсказка

Если разность отрицательная, возьмите её с противоположным знаком.

Задача 2.6.6

Ночной тариф такси

★★☆средняя

Километр поездки стоит 30 рублей с 6 до 23 часов и 45 рублей в остальное время. Вводятся час начала поездки (0–23) и расстояние в километрах. Выведите цену километра и стоимость поездки.

Примеры для проверки

Пример 1
Ввод
14
10
Вывод
Цена километра: 30 руб.
Стоимость поездки: 300 руб.
Пример 2
Ввод
23
10
Вывод
Цена километра: 45 руб.
Стоимость поездки: 450 руб.
Пример 3
Ввод
5
7
Вывод
Цена километра: 45 руб.
Стоимость поездки: 315 руб.
Пример 4
Ввод
6
7
Вывод
Цена километра: 30 руб.
Стоимость поездки: 210 руб.
Подсказка

Тернарный оператор выбирает только цену километра. Стоимость считается обычной формулой.

Задача 2.6.7

Скидка в день рождения

★★☆средняя

В день рождения покупатель получает скидку 15%. Вводятся сумма чека и ответ, день рождения ли сегодня у покупателя: да или нет. Выведите скидку в процентах и сумму к оплате с копейками.

Примеры для проверки

Пример 1
Ввод
2400
да
Вывод
Скидка: 15%
К оплате: 2040.00 руб.
Пример 2
Ввод
2400
нет
Вывод
Скидка: 0%
К оплате: 2400.00 руб.
Подсказка

Логическая переменная может стоять на месте условия: 15 if is_birthday else 0.

Задача 2.6.8

Время с ведущим нулём

★★☆средняя

Вводятся часы и минуты. Выведите время в виде 9:05: если минут меньше десяти, перед ними ставится ноль.

Примеры для проверки

Пример 1
Ввод
9
5
Вывод
9:05
Пример 2
Ввод
14
30
Вывод
14:30
Пример 3
Ввод
0
0
Вывод
0:00
Подсказка

Выбирайте не число, а то, что стоит перед ним: строку "0" или пустую строку.

Задача 2.6.9

Сдача или долг

★★☆средняя

Вводятся цена товара и сумма, которую дал покупатель. Выведите одну строку: Сдача: N руб., если денег хватило, или Не хватает: N руб., если нет. Число в обоих случаях неотрицательное.

Примеры для проверки

Пример 1
Ввод
350
500
Вывод
Сдача: 150 руб.
Пример 2
Ввод
350
300
Вывод
Не хватает: 50 руб.
Пример 3
Ввод
350
350
Вывод
Сдача: 0 руб.
Подсказка

Выборов два: подпись и число. Каждый — своим тернарным оператором в отдельной строке.

Задача 2.6.10

Зачёт с двух попыток

★★☆средняя

Тест можно пройти дважды, в зачёт идёт лучший результат. Зачёт ставят от 60 баллов. Вводятся баллы за две попытки. Выведите лучший балл и результат: зачёт или незачёт.

Примеры для проверки

Пример 1
Ввод
45
72
Вывод
Лучший балл: 72
Результат: зачёт
Пример 2
Ввод
58
40
Вывод
Лучший балл: 58
Результат: незачёт
Пример 3
Ввод
60
10
Вывод
Лучший балл: 60
Результат: зачёт
Подсказка

Сначала выберите лучший балл, потом по нему — результат. Это две отдельные строки.

Задача 2.6.11

Комиссия с верхней границей

★★☆средняя

Банк берёт за перевод 1% от суммы, но не больше 500 рублей. Вводится сумма перевода. Выведите комиссию с копейками.

Примеры для проверки

Пример 1
Ввод
12000
Вывод
Комиссия: 120.00 руб.
Пример 2
Ввод
80000
Вывод
Комиссия: 500.00 руб.
Пример 3
Ввод
50000
Вывод
Комиссия: 500.00 руб.
Подсказка

Посчитайте комиссию по формуле, а затем выберите: оставить её или заменить на 500.

Задача 2.6.12

Перепишите короче

★★☆средняя

Программа считает стоимость абонемента в спортзал: студентам месяц стоит 1500 рублей, остальным — 2500. Перепишите её так, чтобы цена месяца и подпись выбирались тернарными операторами. Вывод не должен измениться.

main.pyдано — переписать
is_student = input() == "да"
months = int(input())
if is_student:
    price = 1500
else:
    price = 2500
if is_student:
    label = "студенческий"
else:
    label = "обычный"
print("Тариф:", label)
print("К оплате:", price * months, "руб.")

Примеры для проверки

Пример 1
Ввод
да
3
Вывод
Тариф: студенческий
К оплате: 4500 руб.
Пример 2
Ввод
нет
6
Вывод
Тариф: обычный
К оплате: 15000 руб.
Подсказка

Каждая пара if / else только присваивает значение одной переменной — её заменяет одна строка.

Задача 2.6.13

Громкость в пределах

★★★повышенная

Громкость плеера — число от 0 до 100. Пользователь вводит текущую громкость и изменение: положительное или отрицательное число. Выведите новую громкость. Если она вышла за границы, в ответе должна быть ближайшая граница.

Примеры для проверки

Пример 1
Ввод
50
20
Вывод
Громкость: 70
Пример 2
Ввод
90
25
Вывод
Громкость: 100
Пример 3
Ввод
10
-30
Вывод
Громкость: 0
Пример 4
Ввод
100
0
Вывод
Громкость: 100
Подсказка

Границы проверяйте по очереди, двумя строками: сначала верхнюю, потом нижнюю.

Задача 2.6.14

Исправьте выражения

★★★повышенная

Программа выводит, сдан ли норматив по бегу и какой получен значок. Норматив сдан, если время не больше 15 секунд; золотой значок дают за время не больше 13 секунд, иначе — серебряный. В программе три ошибки. Исправьте их.

main.pyдано — с ошибками
seconds = float(input())
result = if seconds <= 15 "сдан" else "не сдан"
badge = "золотой" if seconds <= 13
print("Норматив:" result)
print("Значок:", badge)

Примеры для проверки

Пример 1
Ввод
12.8
Вывод
Норматив: сдан
Значок: золотой
Пример 2
Ввод
14.2
Вывод
Норматив: сдан
Значок: серебряный
Пример 3
Ввод
13
Вывод
Норматив: сдан
Значок: золотой
Подсказка

У условного выражения строгий порядок частей и обязательная ветка else. Третья ошибка — в print().

Задача 2.6.15

Счёт в кафе

★★★повышенная

Компания делит счёт поровну. Если гостей шестеро или больше, к счёту добавляется обслуживание 10%. При оплате картой долю каждого считают с копейками, при оплате наличными — округляют до рубля. Вводятся сумма счёта, число гостей и способ оплаты: карта или наличные. Выведите процент за обслуживание и долю каждого с двумя знаками после точки.

Примеры для проверки

Пример 1
Ввод
4500
4
карта
Вывод
Обслуживание: 0%
С каждого: 1125.00 руб.
Пример 2
Ввод
7000
6
карта
Вывод
Обслуживание: 10%
С каждого: 1283.33 руб.
Пример 3
Ввод
7000
6
наличные
Вывод
Обслуживание: 10%
С каждого: 1283.00 руб.
Пример 4
Ввод
1000
3
наличные
Вывод
Обслуживание: 0%
С каждого: 333.00 руб.
Подсказка

Выборов два, и они независимы: процент зависит от числа гостей, округление — от способа оплаты.

§3Как проверить своё решение

  1. Запустите программу и введите значения из колонки «Ввод» — каждое значение отдельной строкой, после каждого Enter.
  2. Сравните то, что напечатала программа, с колонкой «Вывод» — символ в символ: пробелы, двоеточия, количество знаков после точки.
  3. Подсказки input() в примерах не показаны: текст подсказки у каждого свой, проверяется только результат.
  4. Прогоните все примеры, а не только первый: второй обычно ловит ошибку, которую первый пропускает.
Оформление, которое проверяют

Имена переменных называют смысл: total_cost, а не x. Данные — вверху, расчёт — отдельными строками, вывод — в конце. Одно и то же выражение не повторяется: результат сохраняется в переменную и дальше используется по имени.

Задачи к главе 2.6 · Тернарный условный оператор · Задачник по Python Автор: Макаров Максим Николаевич