Python Core

Цикли та ітерація

Цикл while з умовою, цикл for як прохід по ітерованому об'єкту, функція range, інструкції break, continue і else у циклах, вкладені цикли та як зупинити нескінченний цикл.

Цикли та ітерація

Як змусити комп'ютер повторювати

Комп'ютер добре виконує одну й ту саму дію багато разів. Щоб вивести числа від 1 до 1000, не треба писати тисячу рядків: достатньо циклу (loop), який повторює блок коду. У Python є два цикли: while повторює код, поки виконується умова, а for проходить по елементах якогось об'єкта.

🎯 Мета лекції

  • Писати цикл while з правильною умовою виходу.
  • Використовувати for і range для проходу по значеннях.
  • Пояснювати, що for бере елементи по одному в об'єкта.
  • Керувати циклом через break, continue та else.
  • Писати вкладені цикли й зупиняти нескінченний цикл.

🔑 Ключові терміни

  • Цикл (loop): блок коду, який виконується повторно.
  • Ітерація (iteration): один прохід тіла циклу.
  • Ітерований об'єкт (iterable): об'єкт, елементи якого можна перебирати.
  • Умова виходу: умова, після якої цикл while завершується.
  • Нескінченний цикл: цикл, що ніколи не завершується.

Пригадаємо попередній урок

Цикл while

Цикл while перевіряє умову, і поки вона істинна, повторює тіло. Перевірка відбувається перед кожною ітерацією, зокрема першою:

n = 1
while n <= 3:
    print("ітерація", n)
    n += 1
print("після циклу, n =", n)
ітерація 1
ітерація 2
ітерація 3
після циклу, n = 4

Порядок виконання:

  1. Перевірити умову n <= 3.
  2. Якщо істинна, виконати тіло (рядки з відступом) і повернутися до пункту 1.
  3. Якщо хибна, перейти до першого рядка після циклу.

Для коректної роботи цикл має містити три частини: початкове значення (n = 1), умову (n <= 3) і зміну, яка наближає завершення (n += 1). Без зміни умова ніколи не стане хибною.

Простежте цикл у трасувальнику. Зверніть увагу, що умову n > 0 Python перевіряє на кожному колі, і одного разу вона стає хибною:

Цикл while
Завантаження трасування…

Нескінченний цикл і вихід через break

Якщо умова ніколи не стає хибною, цикл не завершується. Це може бути помилкою (забули змінити лічильник) або наміром: тоді умову записують як while True, а вихід роблять через break:

tries = 0
while True:
    tries += 1
    guess = ["abc", "123", "python"][tries - 1]
    if guess == "python":
        print("вірно за", tries, "спроби")
        break
вірно за 3 спроби

Список у прикладі лише імітує три введення. Так працює більшість програм із меню або перевіркою пароля: цикл триває, поки не виконається умова виходу.

Щоб зупинити програму, яка зависла в нескінченному циклі, натисніть Ctrl + C у терміналі. Python перерве виконання винятком KeyboardInterrupt:

while True:
    pass
Traceback (most recent call last):
  File "inf.py", line 2, in <module>
    pass
KeyboardInterrupt
Типова причина нескінченного циклу — зміна, яку забули написати: while n > 0: без n -= 1. Якщо програма «зависла», перевірте, чи змінюється в тілі циклу величина з умови.

Цикл for

Цикл for бере елементи об'єкта по одному й для кожного виконує тіло. Змінна циклу на кожній ітерації вказує на черговий елемент:

for ch in "кіт":
    print(ch, end=" ")
к і т 

Об'єкт, елементи якого можна перебирати, називається ітерованим (iterable). Рядок — один з таких об'єктів, інші (списки, словники) з'являться в наступних уроках. Важливо: for у Python — це не лічильник «від і до», як у C. Це перебір елементів об'єкта.

Як працює for: iter і next

Цикл for виконує три кроки:

  1. Просить об'єкт створити ітератор (iterator) функцією iter(). Ітератор пам'ятає, який елемент наступний.
  2. Бере наступний елемент функцією next() і присвоює змінній циклу.
  3. Коли елементи закінчились, next() викликає виняток StopIteration, і цикл тихо завершується.

Те саме можна зробити вручну (для останнього рядка показано лише кінець повідомлення про помилку):

it = iter("ab")
print(next(it), next(it))
next(it)
a b
StopIteration

Другий аргумент next(it, значення) дозволяє отримати значення за замовчуванням замість винятку. Перевірте це в трасувальнику:

iter і next
Завантаження трасування…

Змінна it вказує на єдиний об'єкт-ітератор, який пам'ятає позицію. Кожен next посуває його на один символ. Коли символи закінчились, next повертає "кінець".

range

Щоб повторити дію задану кількість разів, використовують функцію range. Вона створює послідовність цілих чисел:

ВикликЧисла
range(5)0, 1, 2, 3, 4
range(2, 8)2, 3, 4, 5, 6, 7
range(10, 0, -3)10, 7, 4, 1
range(5, 2)порожня

Форма range(start, stop, step): починаємо зі start, рухаємося кроком step, не доходячи до stop. Початок за замовчуванням 0, крок 1. Верхня межа не входить у результат.

for i in range(3):
    print(i, end=" ")
print()
for i in range(3, 0, -1):
    print(i, end=" ")
print("старт")
0 1 2 
3 2 1 старт

Простежте цикл for з range у трасувальнику:

for i in range(3)
Завантаження трасування…

На кожній ітерації змінна i вказує на наступне число (0, 1, 2), а total накопичує суму. Після останньої ітерації i лишається рівною 2.

range не зберігає числа

Функція range не створює список з усіма числами. Вона зберігає лише три значення: початок, кінець і крок, а потрібне число обчислює, коли про нього просять:

r = range(10**12)
print(len(r), 999_999_999_999 in r)
1000000000000 True

Мільйон мільйонів чисел перевіряється миттєво. Якби вони зберігались у списку, знадобилось би щонайменше 8 ТБ пам'яті лише на посилання. Тому for i in range(1000000) не витрачає пам'ять на мільйон чисел.

Дробів range не приймає: range(3.5) завершується TypeError: 'float' object cannot be interpreted as an integer. Для проходу по числу теж не годиться for i in 5: це TypeError: 'int' object is not iterable. Число не є набором елементів, перебирати можна range(5).

break, continue і else

Три інструкції змінюють звичайний хід циклу:

  • break одразу завершує цикл;
  • continue пропускає залишок поточної ітерації й переходить до наступної;
  • else після циклу виконується, якщо цикл завершився без break.
for i in range(1, 6):
    if i == 2:
        continue
    if i == 5:
        break
    print(i, end=" ")
1 3 4 

Число 2 пропущено через continue, а на 5 цикл перервано через break, тому 5 теж не виведено.

Блок else у циклі найкорисніший для пошуку: він спрацьовує, коли шуканого не знайшли.

n = 17
for d in range(2, n):
    if n % d == 0:
        print(n, "складене, дільник", d)
        break
else:
    print(n, "просте")
17 просте

Якби break спрацював, else було б пропущено. Простежте це в трасувальнику:

break і else
Завантаження трасування…

Для числа 3 спрацьовує break: цикл завершується, блок else пропускається, і виконується лише print("кінець").

else у циклі — це не «інакше», а «якщо без break». Якщо break у циклі немає взагалі, else виконається завжди. Те саме стосується while.

Вкладені цикли

Усередині циклу може бути інший цикл. Зовнішній виконує один крок, а внутрішній щоразу повністю проходить усі свої кроки:

for i in range(1, 4):
    for j in range(1, 4):
        print(i * j, end="\t")
    print()
1   2   3   
2   4   6   
3   6   9   

Внутрішній цикл рухається швидко (як хвилинна стрілка), зовнішній повільно (як годинна). Для i = 1 внутрішній цикл виконує три ітерації, потім print() переводить рядок, і зовнішній цикл переходить до i = 2. Усього 3 × 3 = 9 ітерацій тіла.

break у вкладеному циклі виходить лише з найближчого циклу. Зовнішній продовжить роботу.

Деталі, які варто знати

Змінна циклу залишається після циклу. Після for i in range(1, 4) змінна i дорівнює 3. Якщо цикл не виконався жодного разу, змінна не створюється:

for k in range(0):
    pass
print(k)
NameError: name 'k' is not defined

Зміна змінної циклу не впливає на ітерації. Наступне значення береться з range, а не з попереднього:

for i in range(5):
    i = i * 10
    print(i, end=" ")
0 10 20 30 40 

Ім'я _ за угодою означає, що значення не використовується: for _ in range(3): print("hi").

Типові помилки синтаксису:

for i in range(3)
    print(i)
SyntaxError: expected ':'
n = 5
while n > 0:
print(n)
IndentationError: expected an indented block after 'while' statement on line 2

Підсумок

  1. while перевіряє умову перед кожною ітерацією. Потрібні початкове значення, умова й зміна.
  2. for бере елементи ітерованого об'єкта по одному: створює ітератор через iter() і викликає next() до StopIteration.
  3. range(start, stop, step) не зберігає числа, а обчислює їх; stop не входить.
  4. break завершує цикл, continue пропускає ітерацію, else виконується, якщо break не спрацював.
  5. У вкладених циклах внутрішній цикл проходить повністю на кожну ітерацію зовнішнього.
  6. Нескінченний цикл зупиняє Ctrl + C.

Типові хибні уявлення

Передбачте, перш ніж запускати

Практичні завдання

Наступний урок: налагодження. Як шукати помилки, читати traceback і користуватися дебагером VS Code.
Copyright © 2026