← Python мануфактура

Після цього уроку ви зможете

Конспект і таймкоди

0:00

Структура `src` і Python package

Для експериментів створюється src і окремий Python package. У класичному package файл __init__.py явно позначає директорію як пакет для інструментів і імпортів. Сучасний Python також підтримує namespace packages без __init__.py, але явний пакет часто передбачуваніший для навчального проєкту.

Експерименти з типами відокремлюються від тестів: короткий файл можна запускати напряму, щоб перевірити перетворення або метод перед вбудовуванням у сценарій.

3:00

Рядки й явна типізація

Змінна hello_world: str демонструє рядковий тип. Python здатен вивести тип із правої частини, але annotation робить намір видимим у code review та допомагає IDE з автодоповненням.

Для швидкого експерименту значення виводиться через print(). IDE postfix templates і шорткати скорочують набір коду, але результат залишається звичайним Python-викликом.

Термін

Type hint

Python runtime не примушує function і variable annotations відповідати значенням; annotations споживають type checkers, IDE та інші tools.

6:00

Оголошення і виклик функції

Саме оголошення def print_hello(): нічого не виконує. Функцію треба окремо викликати. Це розділяє опис поведінки та момент її запуску.

Далі функція параметризується ім’ям. Замість фіксованого Hello World вона приймає name і формує f"Hello {name}", тому один алгоритм працює з різними вхідними даними.

9:00

Типи параметрів і повернення

Сигнатура на кшталт def hello_to(name: str) -> str описує вхід і результат. IDE після крапки може підказати методи str, а reviewer одразу бачить контракт функції.

Важливе уточнення: type hints за замовчуванням не перевіряються інтерпретатором як жорстке обмеження й не є оптимізацією швидкодії. Їхню коректність перевіряють IDE, type checker і тести.

12:00

Нормалізація та очищення рядків

.lower() і .upper() нормалізують регістр перед порівнянням, наприклад коли тестові дані й UI відрізняються лише великими літерами. Результат методу — новий рядок; початковий str не змінюється, якщо результат не присвоїти.

.removeprefix("https://") і .removesuffix(...) прибирають точний префікс або суфікс. Якщо збігу немає, рядок повертається без змін. Це безпечніше за довільне replace(), коли потрібно обробити лише край рядка.

Що змінилося після запису

Версійна межа `removeprefix()` і `removesuffix()`

АктуальноЦі methods додані у Python 3.9. Оскільки версію Python у metadata уроку не надано, автору треба підтвердити, що course runtime — Python 3.9 або новіший.

Перевірено 2026-07-31

Термін

removeprefix / removesuffix

str.removeprefix() і str.removesuffix() повертають рядок без точного prefix або suffix, а за відсутності збігу повертають початковий рядок.

16:00

`split()` і змінюваний `list`

.split(separator) перетворює один рядок на list[str], наприклад список email або частини тексту. Після цього до елементів можна звертатися за індексом, видаляти, вставляти або сортувати їх.

Під час експерименту видно важливу особливість: методи на кшталт list.insert() змінюють список на місці й повертають None. Тому результат не треба присвоювати назад у список; спочатку викликається emails.insert(...), потім читається emails.

Термін

In-place list operation

Methods mutable collections, які лише змінюють object, повертають None; тому list.insert() і list.sort() не треба присвоювати назад змінній.

19:00

`startswith()`, `endswith()` і `bool`

.startswith() і .endswith() повертають True або False. Це дозволяє перевірити протокол або закінчення URL без ручного пошуку підрядка.

Boolean використовується в if/else: якщо адреса починається з https, код повідомляє про захищений протокол, інакше — про незахищений. У тестах такий результат може керувати різними перевірками залежно від стану сторінки або даних.

23:00

Перетворення тексту на `int` і `float`

Текст, отриманий з UI, залишається рядком навіть тоді, коли візуально містить число. Для арифметики його явно перетворюють: int(page_number_text) для індексу пагінації або float(price_text) для демонстраційного десяткового значення.

Некоректний числовий рядок спричинить ValueError, тому на trust boundary формат треба перевірити або обробити помилку. Для точних грошових розрахунків float небезпечний через двійкове округлення; у production краще Decimal або цілі minor units, наприклад копійки/центи.

Уточнення

Не використовуйте binary `float` для точних грошей

Для цін і підсумків, де потрібна точна decimal arithmetic, використовуйте Decimal зі string input або integer minor units; float не може точно представляти більшість decimal fractions.

Термін

Decimal

Decimal представляє decimal numbers exactly і зберігає значущі trailing zeros, тому придатніший за binary float для точних фінансових значень.

Приклад коду

Сортування цін через `Decimal`

from decimal import Decimal

prices = [Decimal(value) for value in ("10.99", "9.43", "12.20")]
prices.sort(reverse=True)

assert prices[0] == max(prices)
print(prices)

UI-like string values перетворюються на exact Decimal, сортуються за спаданням і перевіряються через max().

Очікуваний результат: Друкується [Decimal('12.20'), Decimal('10.99'), Decimal('9.43')].

Практика

Перетворити й відсортувати UI prices

  1. Підготуйте три price strings з двома decimal знаками.
  2. Перетворіть їх через Decimal, не через float.
  3. Відсортуйте новий список за спаданням і перевірте перший елемент через max().

Результат: Сортування точне, а початковий список можна зберегти для окремого assertion.

26:00

Списки цін, `max()` і читабельна перевірка

Кілька цін збираються в типізований список, наприклад list[float]. max(prices) знаходить найбільше значення, а перший елемент можна порівняти з ним, щоб перевірити сортування «від більшої ціни».

Навіть коротку, але предметно важливу логіку пропонується оформити функцією на кшталт is_first_price_highest(prices). Назва пояснює вимогу краще, ніж вкладене порівняння всередині великого тесту.

30:00

Сортування на місці та локальна область видимості

prices.sort(reverse=True) змінює наявний список і повертає None. Після сортування повторна перевірка показує, що перша ціна стала максимальною. Якщо початковий порядок ще потрібен, слід використати sorted(prices, reverse=True), який повертає новий список.

Змінна, створена всередині функції, є локальною й недоступна ззовні. Водночас функція може читати значення з ширшої області, хоча явні параметри зазвичай роблять залежності тестового helper зрозумілішими.

33:00

Атрибути класу й `self`

У класі значення екземпляра зберігаються як self.name. self вказує, що атрибут належить конкретному створеному об’єкту, а не є випадковою локальною змінною функції.

Методи того самого екземпляра звертаються до цього значення через self.name. Якщо пропустити self, Python шукатиме локальне або глобальне ім’я й отримає NameError або попередження IDE.

37:00

Виклик методів і підсумок області видимості

Один метод класу може викликати інший через self.get_name() і використати повернене значення. Після створення екземпляра з обов’язковим аргументом викликається публічний метод, а внутрішні деталі залишаються в класі.

Підсумкова модель: локальні змінні живуть у функції; атрибути екземпляра доступні методам через self; модульні значення доступні коду після їх оголошення. Подальша практика — брати конкретну задачу автоматизації, експериментувати з одним типом у короткому файлі, а потім переносити перевірений вираз у тест.

Джерела та додаткові матеріали

  • Built-in Types ↗Python Software Foundation · перевірено 2026-07-31

    Підтверджує й актуалізує поняття уроку: Text Sequence Type — str / Mutable Sequence Types.

  • typing — Support for type hints ↗Python Software Foundation · перевірено 2026-07-31

    Підтверджує й актуалізує поняття уроку: The Python runtime does not enforce function and variable type annotations.

  • decimal — Decimal fixed-point and floating-point arithmetic ↗Python Software Foundation · перевірено 2026-07-31

    Підтверджує й актуалізує поняття уроку: Quick-start Tutorial.