Модуль 2 · Урок 8 із 58
Цикли, range і контроль виконання
Цикл має не просто «крутитися», а мати джерело елементів або чіткий progress invariant, умову завершення й перевірюваний результат. Розберемо, коли обирати for чи while, як не отримати нескінченне виконання й як зробити пошук прозорим.
Безпечна практика модуля 2
Пакет містить тільки синтетичний rule router, decision table та локальні tests. Жодних реальних звернень, персональних даних, secrets, мережевих викликів або зовнішніх залежностей.
for проходить iterable, а не «рахує сам»
for бере елементи з iterable по одному. Для рядка це символи, для списку — його елементи, для range — послідовність чисел. Якщо потрібен і порядковий номер, використовуйте enumerate(), а не ручний лічильник.
labels = ["normal", "skip", "urgent"]
for position, label in enumerate(labels, start=1):
print(position, label)У модулі 4 ми глибше розберемо колекції та безпечні способи їх змінювати. Поки не видаляйте елементи зі списку, по якому одночасно проходить цикл: це змінює індекси й пропускає cases.
range має виключну stop-межу
range(start, stop, step) генерує значення від start до, але не включно, stop. range(5) дає 0–4. Об’єкт range не будує великий список наперед, тому підходить для контрольованого числового повторення.
for attempt in range(1, 4):
print(f"Спроба {attempt} із 3")
for value in range(10, 4, -2):
print(value) # 10, 8, 6Якщо потрібно виконати 3 спроби з номерами 1, 2, 3, stop має бути 4. Off-by-one баги ловляться тестом першого, останнього й загальної кількості значень.
while потребує progress invariant
while доречний, коли кількість ітерацій наперед невідома, але є condition. Перед запуском дайте відповідь: що змінюється на кожному кроці, чому умова колись стане false і чи потрібна hard limit.
remaining = 3
while remaining > 0:
print(f"Залишилось: {remaining}")
remaining -= 1
print("Готово")Якщо забути remaining -= 1, invariant прогресу зникає. У network retry одного condition недостатньо: потрібні max attempts, timeout і backoff; це розберемо в модулі інтеграцій.
continue пропускає case, break завершує пошук
continue переходить до наступної ітерації, а break виходить із найближчого циклу. Використовуйте їх для чіткої причини, не як спосіб приховати складну структуру.
labels = ["", "normal", "urgent", "normal"]
found_at = None
for position, raw_label in enumerate(labels, start=1):
label = raw_label.strip().casefold()
if not label:
continue
if label == "urgent":
found_at = position
break
print(found_at) # 3Результат None означає «не знайдено», а не позицію 0. Це зберігає різницю між відсутністю й валідним індексом.
else циклу означає «break не спрацював»
У for або while блок else виконується, коли цикл завершився природно, але не після break. Це корисно для пошуку, однак команда має знати цю конструкцію; інколи явний result variable читається простіше.
for label in ["normal", "review"]:
if label == "urgent":
print("Знайдено")
break
else:
print("Urgent case відсутній")Що тестувати в циклі
break на першому елементі.while має hard evidence, що condition змінюється.Практика модуля 2: синтетичний rule router
Завантажте пакет модуля й виконайте tests. Потім додайте власні boundary cases: порожню label, priority 1/5, 59/60 хвилин, blocker і список без urgent case. Збережіть expected/observed report. У пакеті немає зовнішніх залежностей або реальних даних.
- Типи й conversion виконуються на межі.
None, нуль і порожній text не змішані.- Decision table відповідає порядку
if/elif. forіwhileмають зрозуміле завершення.- Усі локальні тести проходять повторно.
Модуль 2 завершено
Після тесту прогрес становитиме 8/58 уроків. Фінальний іспит, PDF, QR та email-сертифікат залишаються заблокованими до всіх 16 модулів і чотирьох прийнятих проєктів. Далі — функції та модулі.
Методичні джерела
Урок, сценарії, пояснення й вправи створені SEOWORK. Посилання ведуть лише на офіційну документацію Python.
Закріпіть матеріал уроку
Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.