Модуль 4 · Урок 13 із 58
Списки й кортежі: контракт послідовності
Послідовність — це не просто «кілька значень». Вона має порядок, межі, правила зміни й очікувану форму елемента. Вибір між list і tuple має показувати, чи колекція росте й редагується, чи фіксує стабільний запис для читання та unpacking.
Безпечна практика модуля 4
Пакет містить тільки synthetic records, pure collection functions, import-safe CLI і локальні tests. Жодних персональних чи production-даних, secrets, мережевих викликів або зовнішніх залежностей.
Спочатку визначте форму
Перед створенням collection запишіть: що означає один element, чи важливий order, чи дозволені duplicates, хто має право змінювати container і що робити з порожнім input. Без цього items швидко перетворюється на суміш рядків, чисел і випадкових sentinel values.
list — змінна впорядкована послідовність
routes = ["standard", "urgent", "review"]
routes.append("archive")
first = routes[0]
last = routes[-1]
middle = routes[1:3]Index читає одну позицію й піднімає IndexError поза межами. Slice використовує half-open interval: start входить, stop — ні; надто широка межа не падає, а повертає доступну частину. Це різні контракти, тому negative test для index і boundary test для slice мають бути окремими.
Методи, що змінюють list, повертають None
routes = ["review", "urgent", "standard"]
result = routes.sort()
print(routes) # список відсортований
print(result) # Noneappend, extend, sort і reverse змінюють object на місці та не повертають сам collection. Запис routes = routes.sort() втрачає binding до list. Якщо потрібен новий результат зі збереженням input, використайте sorted(routes).
tuple фіксує container, але не заморожує вкладені objects
record = ("case-17", "urgent", 75)
case_id, route, minutes = record
nested = (["review"], "owner-a")
nested[0].append("urgent") # inner list mutableTuple не підтримує item assignment, але його елемент може бути mutable. Тому «tuple = усе immutable» — неправильна модель. Tuple доречний для невеликої стабільної структури, яку unpack-ять за позиціями; коли полів багато або їхній сенс неочевидний, потрібна виразніша record model у наступних модулях.
Copy — це рішення про ownership
original = [["a"], ["b"]]
shallow = original.copy()
shallow.append(["c"])
shallow[0].append("shared")
print(len(original)) # 2: outer list independent
print(original[0]) # ["a", "shared"]: inner list sharedShallow copy створює новий outer container і повторно використовує references на вкладені objects. Не застосовуйте deepcopy автоматично: він може копіювати більше, ніж дозволяє domain ownership. Краще спростити shape або явно побудувати потрібні nested values.
Практика й Definition of Done
- Опишіть collection contract для synthetic queue records.
- Перевірте empty, first, last, exact slice та out-of-range index.
- Порівняйте
sort()іsorted()з assertion про input. - Розпакуйте tuple у names і навмисно перевірте wrong arity.
- Покажіть shallow-copy boundary на вкладеному list.
Методичні джерела
- Python tutorial: More on Lists
- Python tutorial: Tuples and Sequences
- Python copy: shallow and deep copy
Урок, сценарії, пояснення й вправи створені SEOWORK. Посилання ведуть лише на офіційну документацію Python.
Закріпіть матеріал уроку
Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.