Українська
Практика
Приклад 1. Конвертер одиниць довжини
Написати програму, яка читає невід’ємну цілу довжину в метрах від 0 до 1000000 та одиницю результату m, cm або km. Функція обчислення приймає лише іменований параметр одиниці й повертає None для невідомої одиниці. Функція введення тут не потрібна: перевірка коротка й виконується лише один раз.
py
def convert(metres: float, *, unit: str = "km") -> float | None:
"""Перетворити невід’ємну скінченну довжину в метрах."""
if unit == "m":
return metres
if unit == "cm":
return metres * 100
if unit == "km":
return metres / 1000
return None
text = input("Метри, ціле 0..1000000: ").strip()
unit = input("Одиниця m/cm/km: ").strip()
if not (1 <= len(text) <= 7 and text.isascii()
and text.isdecimal() and int(text) <= 1_000_000):
print("Помилка: потрібне ціле від 0 до 1000000")
else:
answer = convert(float(text), unit=unit)
if answer is None:
print("Помилка: невідома одиниця")
else:
print(f"Результат: {answer:.3f} {unit}")Для введення 1250, km:
Результат: 1.250 kmКоротке обчислення and гарантує, що int виконається лише після перевірки цифр. Нуль – коректна довжина, тому результат перевіряємо через is None, а не через його істинність. За контрактом обчислення отримує скінченне число; консольний інтерфейс забезпечує цю передумову обмеженою довжиною тексту. Для 0, cm очікується 0.000 cm; для -1, порожнього рядка та 1000001 – повідомлення про помилку.
Приклад 2. Сума цифр і паліндром
Ввести від 1 до 12 ASCII-цифр. Сума цифр обчислюється рекурсивним відокремленням останньої цифри. Паліндром перевіряється за початковим текстом, тому початкові нулі мають значення. Наприклад, 0110 є паліндромом, хоча ціле число 110 ним не є.
py
def digit_sum(number: int) -> int:
"""Сума цифр невід’ємного цілого."""
if number < 10:
return number
return number % 10 + digit_sum(number // 10)
def palindrome(text: str, left: int, right: int) -> bool:
"""Перевірити текст між включними індексами."""
if left >= right:
return True
return (text[left] == text[right]
and palindrome(text, left + 1, right - 1))
text = input("Від 1 до 12 цифр: ").strip()
if not (1 <= len(text) <= 12 and text.isascii()
and text.isdecimal()):
print("Помилка: потрібні ASCII-цифри, не більше 12")
else:
print("Сума:", digit_sum(int(text)))
print("Паліндром:", palindrome(text, 0, len(text) - 1))Для введення 12321:
Сума: 9
Паліндром: TrueСума для 0 дорівнює 0; однолітерний текст є паліндромом. Для 123 сума дорівнює 6, результат перевірки – False. Обмеження довжини захищає і перетворення, і глибину рекурсії. Рекурсивна перевірка не створює копій підрядків, бо передає індекси. Коли крайні символи різні, and не виконує наступного виклику.
Приклад 3. Звіт замовлення
Створити програму з функцією, яка приймає назву покупця лише позиційно, коефіцієнт знижки лише за ім’ям і довільний набір іменованих сум товарів. У навчальному прикладі всі суми – невід’ємні цілі гривні, знижка від 0 до 1. Повернути рядок звіту та підсумок. Перевірку довільного введення тут не реалізуємо: дані задано безпосередньо, щоб побачити розпакування.
py
def order_report(customer: str, /, *, discount: float = 0.0,
**amounts: int) -> tuple[str, float]:
"""Звіт для цілих сум >= 0 та 0 <= discount <= 1."""
lines = [f"Покупець: {customer}"]
subtotal = 0
for name, amount in amounts.items():
lines.append(f"{name:<12}{amount:>8.2f}")
subtotal += amount
total = subtotal * (1 - discount)
lines.append(f"{'До сплати':<12}{total:>8.2f}")
return "\n".join(lines), total
products = {"tea": 40, "bread": 60}
report, total = order_report("Олена", discount=0.1, **products)
print(report)
print("Перевірка:", total == 90.0)Покупець: Олена
tea 40.00
bread 60.00
До сплати 90.00
Перевірка: Trueitems() дає пари «ключ, значення», join з’єднує рядки символом нового рядка. Порядок товарів відповідає порядку додавання до словника. Ключі discount і customer не слід використовувати як назви товарів: перший має спеціальне значення, другий створює зайву неоднозначність контракту. Для реальних грошових розрахунків потрібне явно визначене десяткове округлення; цей приклад демонструє функції на простих навчальних сумах.