Цикли та ітерація
Цикли та ітерація
Як змусити комп'ютер повторювати
Комп'ютер добре виконує одну й ту саму дію багато разів. Щоб вивести числа від 1 до 1000, не треба писати тисячу рядків: достатньо циклу (loop), який повторює блок коду. У Python є два цикли: while повторює код, поки виконується умова, а for проходить по елементах якогось об'єкта.
🎯 Мета лекції
- Писати цикл
whileз правильною умовою виходу. - Використовувати
forіrangeдля проходу по значеннях. - Пояснювати, що
forбере елементи по одному в об'єкта. - Керувати циклом через
break,continueтаelse. - Писати вкладені цикли й зупиняти нескінченний цикл.
🔑 Ключові терміни
- Цикл (loop): блок коду, який виконується повторно.
- Ітерація (iteration): один прохід тіла циклу.
- Ітерований об'єкт (iterable): об'єкт, елементи якого можна перебирати.
- Умова виходу: умова, після якої цикл
whileзавершується. - Нескінченний цикл: цикл, що ніколи не завершується.
Пригадаємо попередній урок
5: оператор or повертає один з операндів, а не True.False, 0, 0.0, порожній рядок, порожні колекції та None.Цикл while
Цикл while перевіряє умову, і поки вона істинна, повторює тіло. Перевірка відбувається перед кожною ітерацією, зокрема першою:
n = 1
while n <= 3:
print("ітерація", n)
n += 1
print("після циклу, n =", n)
ітерація 1
ітерація 2
ітерація 3
після циклу, n = 4
Порядок виконання:
- Перевірити умову
n <= 3. - Якщо істинна, виконати тіло (рядки з відступом) і повернутися до пункту 1.
- Якщо хибна, перейти до першого рядка після циклу.

Для коректної роботи цикл має містити три частини: початкове значення (n = 1), умову (n <= 3) і зміну, яка наближає завершення (n += 1). Без зміни умова ніколи не стане хибною.
Простежте цикл у трасувальнику. Зверніть увагу, що умову n > 0 Python перевіряє на кожному колі, і одного разу вона стає хибною:
Нескінченний цикл і вихід через 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 виконує три кроки:
- Просить об'єкт створити ітератор (iterator) функцією
iter(). Ітератор пам'ятає, який елемент наступний. - Бере наступний елемент функцією
next()і присвоює змінній циклу. - Коли елементи закінчились,
next()викликає винятокStopIteration, і цикл тихо завершується.
Те саме можна зробити вручну (для останнього рядка показано лише кінець повідомлення про помилку):
it = iter("ab")
print(next(it), next(it))
next(it)
a b
StopIteration
Другий аргумент next(it, значення) дозволяє отримати значення за замовчуванням замість винятку. Перевірте це в трасувальнику:
Змінна 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 у трасувальнику:
На кожній ітерації змінна 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 було б пропущено. Простежте це в трасувальнику:
Для числа 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
Підсумок
whileперевіряє умову перед кожною ітерацією. Потрібні початкове значення, умова й зміна.forбере елементи ітерованого об'єкта по одному: створює ітератор черезiter()і викликаєnext()доStopIteration.range(start, stop, step)не зберігає числа, а обчислює їх;stopне входить.breakзавершує цикл,continueпропускає ітерацію,elseвиконується, якщоbreakне спрацював.- У вкладених циклах внутрішній цикл проходить повністю на кожну ітерацію зовнішнього.
- Нескінченний цикл зупиняє Ctrl + C.
Типові хибні уявлення
for у Python перебирає елементи об'єкта. Лічильник у циклі створює range, а не сам for.range зберігає лише початок, кінець і крок. Числа обчислюються по одному.range(1, 5) дає 1, 2, 3, 4.else виконується, коли цикл завершився без break, зокрема коли ітерацій не було зовсім.Передбачте, перш ніж запускати
for i in range(3, 0, -1):
print(i, end=" ")
print("старт")
3 2 1 старт
Крок -1 рухає від 3 вниз; 0 не входить.
x = 10
while x > 0:
x -= 3
print(x)
-2
Значення x: 10, 7, 4, 1, -2. Цикл завершується на -2, бо -2 > 0 хибне.
for i in range(5):
if i == 2:
continue
if i == 4:
break
print(i, end=" ")
0 1 3
Число 2 пропущено через continue, на 4 цикл перервано.
for i in range(3):
pass
else:
print("else", i)
else 2
break не було, тому else виконується, а i лишилась рівною 2.
Практичні завдання
while та через for з range. Результат 5050.total = 0
n = 1
while n <= 100:
total += n
n += 1
print(total)
total = 0
for n in range(1, 101):
total += n
print(total)
5050
5050
n і виведіть таблицю множення на нього від 1 до 10 у форматі 7 x 3 = 21.n = int(input("Число: "))
for i in range(1, 11):
print(f"{n} x {i} = {n * i}")
else.for n in range(2, 31):
for d in range(2, n):
if n % d == 0:
break
else:
print(n, end=" ")
2 3 5 7 11 13 17 19 23 29
7. Користувач вводить здогадки, доки не вгадає. Після кожної неправильної здогадки програма підказує «менше» або «більше». Наприкінці виведіть кількість спроб.secret = 7
tries = 0
while True:
guess = int(input("Здогадка: "))
tries += 1
if guess == secret:
print("Вгадали за", tries, "спроб")
break
elif guess < secret:
print("більше")
else:
print("менше")
Логіка та розгалуження
Порівняння та ланцюжки порівнянь, логічні оператори and, or, not з коротким замиканням, істинність значень, розгалуження if, elif, else, умовний вираз та інструкція match.
Налагодження (debugging)
Типи помилок — синтаксичні, виконання та логічні; як читати traceback знизу вгору; print-налагодження; дебагер VS Code з breakpoint, step over і step into; вбудована функція breakpoint(); метод гумової качки.