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

Цикли, range і контроль виконання

Цикл має не просто «крутитися», а мати джерело елементів або чіткий progress invariant, умову завершення й перевірюваний результат. Розберемо, коли обирати for чи while, як не отримати нескінченне виконання й як зробити пошук прозорим.

for / whilerangebreak / continueLoop invariant

Безпечна практика модуля 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 відсутній")

Що тестувати в циклі

EmptyПорожній iterable не виконує body жодного разу.
OneОдин element ловить помилки initial state.
ManyКілька елементів перевіряють accumulation і order.
First matchbreak на першому елементі.
Last / absentMatch в кінці та повний прохід без match.
Terminationwhile має hard evidence, що condition змінюється.

Практика модуля 2: синтетичний rule router

Завантажте пакет модуля й виконайте tests. Потім додайте власні boundary cases: порожню label, priority 1/5, 59/60 хвилин, blocker і список без urgent case. Збережіть expected/observed report. У пакеті немає зовнішніх залежностей або реальних даних.

Definition of Done
  • Типи й conversion виконуються на межі.
  • None, нуль і порожній text не змішані.
  • Decision table відповідає порядку if/elif.
  • for і while мають зрозуміле завершення.
  • Усі локальні тести проходять повторно.

Модуль 2 завершено

Після тесту прогрес становитиме 8/58 уроків. Фінальний іспит, PDF, QR та email-сертифікат залишаються заблокованими до всіх 16 модулів і чотирьох прийнятих проєктів. Далі — функції та модулі.

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

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

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

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

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

1. Потрібно пройти labels і мати зрозумілий номер позиції з 1. Який підхід кращий за ручний counter?
2. Які значення згенерує range(1, 4) і яке правило stop-межі це підтверджує?
3. У while remaining > 0 забули змінювати remaining. Який ключовий контракт циклу порушено?