Модуль 2 · Урок 6 із 58

Рядки, Unicode, індекси та зрізи

Текст здається простим, поки в ньому не з’являються пробіли, різний регістр, українські символи або порожнє значення. Розберемо рядок як незмінну послідовність і побудуємо текстову обробку з явним контрактом, а не ланцюжок випадкових replace.

Unicode strIndex / sliceNormalizeFormat

Безпечна практика модуля 2

Пакет містить тільки синтетичний rule router, decision table та локальні tests. Жодних реальних звернень, персональних даних, secrets, мережевих викликів або зовнішніх залежностей.

Завантажити практичний пакет →

str зберігає текст, bytes — закодовані байти

У Python текст представлений об’єктом str і працює з Unicode. Це дозволяє без окремого «типу кирилиці» зберігати "Київ", "SEO" та інші символи в одному рядку. bytes — інша сутність: послідовність байтів на межі файла, мережі чи протоколу. Не кодуйте й не декодуйте текст посеред бізнес-логіки без конкретної межі.

city = "Київ"
print(type(city))       # <class 'str'>
print(len(city))        # 4

payload = city.encode("utf-8")
restored = payload.decode("utf-8")
print(restored == city) # True

len() рахує елементи Python-рядка, але видима для людини «літера» інколи складається з кількох Unicode code points. Для більшості навчальних прикладів індексація достатня, та не використовуйте len() як універсальний вимір візуальної ширини.

Рядки незмінні

Символ усередині str не можна замінити присвоєнням за індексом. Методи strip(), replace(), lower() або casefold() повертають новий рядок. Якщо результат не прив’язати до імені, original залишиться без змін.

raw_label = "  Python Basics  "
clean_label = raw_label.strip()
lookup_key = clean_label.casefold()

print(raw_label)   # пробіли залишились
print(clean_label) # Python Basics
print(lookup_key)  # python basics

Зберігайте display value і lookup key окремо. Автоматичне перетворення всього тексту в lowercase може зіпсувати ім’я, абревіатуру або юридичне написання.

Індекс і half-open slice

Перший елемент має індекс 0, останній доступний як -1. Зріз text[start:stop] включає start, але не включає stop. Така half-open модель спрощує довжину: stop - start.

code = "PYTHON"
print(code[0])      # P
print(code[-1])     # N
print(code[0:2])    # PY
print(code[2:])     # THON
print(code[:])      # PYTHON
Порожній slice і IndexError — не те саме.

code[20:30] поверне порожній рядок, а code[20] викличе IndexError. Тести мають покривати коротші за очікування рядки.

Нормалізація має бути мінімальною й поясненою

Перед порівнянням часто достатньо прибрати крайові пробіли й застосувати casefold(). Не видаляйте всі пробіли, дефіси або символи «про всяк випадок»: ви можете злити різні значення. Політика нормалізації залежить від задачі.

raw_status = "  READY "
status_key = raw_status.strip().casefold()

if status_key == "ready":
    print("Можна запускати перевірку")

Для user-facing output залишайте original або окремо очищений display text. Для key використовуйте стабільне правило й тести з українським та латинським текстом, порожнім значенням і повторними пробілами.

split, join та membership

split() розбиває рядок на частини, join() збирає послідовність рядків із визначеним separator, а оператор in перевіряє входження. Не будувати CSV вручну через split(',') — формат має quoting і окремий модуль стандартної бібліотеки, який з’явиться в курсі роботи з файлами.

raw_tags = "python, cli, testing"
tags = [part.strip() for part in raw_tags.split(",")]
summary = " · ".join(tags)

print("python" in tags) # True
print(summary)          # python · cli · testing

List comprehension тут показана як короткий preview. Повну роботу зі списками, словниками, множинами й comprehensions розберемо в модулі 4.

Форматування — це інтерфейс

f-рядок робить підстановки видимими поруч із текстом. Форматування числа керує представленням, але не змінює саме значення. Для діагностики корисний specifier !r, бо він показує лапки й приховані крайові пробіли.

topic = " Python "
minutes = 45

print(f"raw={topic!r}")
print(f"Тема: {topic.strip()}; тривалість: {minutes} хв.")

Практика: нормалізатор мітки

  1. Прийміть raw label і збережіть original.
  2. Побудуйте display label через strip().
  3. Побудуйте lookup key через casefold().
  4. Відхиліть порожній display label умовою з наступного уроку.
  5. Перевірте український текст, латиницю, крайові пробіли, один символ і порожній input.

У evidence запишіть raw через !r, expected display, expected key та observed. Не підставляйте реальні ПІБ, email чи клієнтські назви.

Методичні джерела

Урок, сценарії, пояснення й вправи створені SEOWORK. Посилання ведуть лише на офіційну документацію Python.

Практична перевірка · урок 6 з 47

Закріпіть матеріал уроку

Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.

1. Після clean = raw.strip() змінна raw усе ще містить крайові пробіли. Чому це очікувана поведінка?
2. Що поверне зріз code[0:2] для рядка 'PYTHON' і яке правило це демонструє?
3. Чим відрізняється code[20] від code[20:30], якщо рядок значно коротший за ці індекси?