Циклічні оператори
Циклічні оператори — це одна з найважливіших конструкцій у програмуванні. Вони дозволяють автоматично виконувати одні й ті самі дії багато разів, без необхідності писати однаковий код знову і знову.
Навіщо потрібні цикли?
Уявіть, що вам потрібно вивести числа від 1 до 100. Без циклів вам довелося б написати 100 рядків коду:
print(1) print(2) print(3) # ... ще 97 рядків
З циклами це можна зробити всього в 2 рядки:
for i in range(1, 101): print(i)
Що потрібно знати перед вивченням циклів?
Перед тим, як приступити до вивчення циклів, корисно розуміти:
- Змінні — як створювати та змінювати їх значення
- Умовні оператори (
if,else,elif) — для контролю виконання коду всередині циклів - Логічні оператори (
and,or,not) — для складних умов у циклах - Базові структури даних — списки, рядки, словники (для перебору елементів)
Види циклів у Python
У Python є два основних типи циклів:
for— коли ви знаєте, скільки разів потрібно повторити дію, або коли потрібно перебрати елементи колекціїwhile— коли дія повинна повторюватися, поки виконується певна умова
Цикл for
Простий приклад використання for
Виводить числа від 0 до 4.
for i in range(5): print(i) # 0 # 1 # 2 # 3 # 4
Як працює range
range(stop)
Виводить числа від 0 до 4 (не включаючи 5).
for i in range(5): print(i) # 0 # 1 # 2 # 3 # 4
range(start, stop)
Виводить числа від 2 до 5.
for i in range(2, 6): print(i) # 2 # 3 # 4 # 5
range(start, stop, step)
Виводить числа від 1 до 9 з кроком 2.
for i in range(1, 10, 2): print(i) # 1 # 3 # 5 # 7 # 9
Цикл for з перебором елементів списку
Перебирає елементи списку та виводить їх.
fruits = ["яблуко", "банан", "вишня"] for fruit in fruits: print(fruit) # яблуко # банан # вишня
Перебір рядків
Перебирає кожен символ у рядку.
word = "Python" for letter in word: print(letter) # P # y # t # h # o # n
Використання enumerate()
Отримує індекс та значення елемента одночасно.
colors = ["червоний", "зелений", "синій"] for index, color in enumerate(colors): print(f"{index}: {color}") # 0: червоний # 1: зелений # 2: синій
enumerate() з власним початковим індексом
Починає нумерацію з 1 замість 0.
students = ["Олена", "Максим", "Ірина"] for number, student in enumerate(students, start=1): print(f"Студент #{number}: {student}") # Студент #1: Олена # Студент #2: Максим # Студент #3: Ірина
Перебір словника (dictionary)
Перебір ключів словника
person = {"ім'я": "Іван", "вік": 30, "місто": "Київ"} for key in person: print(key) # ім'я # вік # місто
Перебір значень словника
person = {"ім'я": "Іван", "вік": 30, "місто": "Київ"} for value in person.values(): print(value) # Іван # 30 # Київ
Перебір ключів та значень словника
person = {"ім'я": "Іван", "вік": 30, "місто": "Київ"} for key, value in person.items(): print(f"{key}: {value}") # ім'я: Іван # вік: 30 # місто: Київ
Комбінування кількох списків (zip)
Перебирає кілька списків одночасно.
names = ["Аліса", "Боб", "Чарлі"] ages = [25, 30, 35] for name, age in zip(names, ages): print(f"{name} має {age} років") # Аліса має 25 років # Боб має 30 років # Чарлі має 35 років
Використання for з умовою (continue, break)
Пропускає число 5 та завершує цикл при досягненні 8.
for num in range(10): if num == 5: continue if num == 8: break print(num) # 0 # 1 # 2 # 3 # 4 # 6 # 7
Використання reversed() для зворотного перебору
Перебирає елементи у зворотному порядку.
numbers = [1, 2, 3, 4, 5] for num in reversed(numbers): print(num) # 5 # 4 # 3 # 2 # 1
Зворотний перебір з range
Виводить числа від 10 до 1.
for i in range(10, 0, -1): print(i) # 10 # 9 # 8 # 7 # 6 # 5 # 4 # 3 # 2 # 1
Використання else з циклом for
Блок else виконується після завершення циклу, якщо він не був перерваний break.
for i in range(5): print(i) else: print("Цикл завершено успішно!") # 0 # 1 # 2 # 3 # 4 # Цикл завершено успішно!
else не виконується при break
for i in range(5): if i == 3: print("Знайдено 3, виходимо") break print(i) else: print("Це не виведеться") # 0 # 1 # 2 # Знайдено 3, виходимо
Практичні приклади використання циклів
Обчислення суми чисел
numbers = [10, 20, 30, 40, 50] total = 0 for num in numbers: total += num print(f"Сума: {total}") # Сума: 150
Пошук максимального значення
numbers = [23, 45, 12, 78, 34, 67] max_value = numbers[0] for num in numbers: if num > max_value: max_value = num print(f"Максимальне значення: {max_value}") # Максимальне значення: 78
Підрахунок кількості певних елементів
grades = [5, 4, 5, 3, 5, 4, 5, 2] count_excellent = 0 for grade in grades: if grade == 5: count_excellent += 1 print(f"Кількість оцінок '5': {count_excellent}") # Кількість оцінок '5': 4
Створення нового списку на основі існуючого
prices = [100, 200, 150, 300] discounted_prices = [] for price in prices: discounted_prices.append(price * 0.9) # знижка 10% print(discounted_prices) # [90.0, 180.0, 135.0, 270.0]
Фільтрація елементів
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] even_numbers = [] for num in numbers: if num % 2 == 0: even_numbers.append(num) print(even_numbers) # [2, 4, 6, 8, 10]
Побудова рядка з елементів списку
words = ["Python", "це", "потужна", "мова"] sentence = "" for word in words: sentence += word + " " print(sentence.strip()) # Python це потужна мова
Таблиця множення
number = 5 for i in range(1, 11): result = number * i print(f"{number} × {i} = {result}") # 5 × 1 = 5 # 5 × 2 = 10 # 5 × 3 = 15 # 5 × 4 = 20 # 5 × 5 = 25 # 5 × 6 = 30 # 5 × 7 = 35 # 5 × 8 = 40 # 5 × 9 = 45 # 5 × 10 = 50
Цикл while
Простий приклад використання while
Виводить значення змінної count, поки вона більше нуля.
count = 3 while count > 0: print(count) count -= 1 # 3 # 2 # 1
Використання while з умовою (continue, break)
Пропускає парні числа та завершує цикл, коли i стає більше 7.
i = 0 while i < 10: i += 1 if i % 2 == 0: continue if i > 7: break print(i) # 1 # 3 # 5 # 7
Використання else з циклом while
Блок else виконується після завершення циклу while, якщо умова стала хибною (а не через break).
count = 0 while count < 3: print(count) count += 1 else: print("Цикл завершено!") # 0 # 1 # 2 # Цикл завершено!
Практичні приклади з while
Введення даних до виконання умови
password = "" while password != "python123": password = input("Введіть пароль: ") print("Доступ дозволено!")
Гра "Вгадай число"
secret_number = 7 guess = 0 attempts = 0 while guess != secret_number: guess = int(input("Вгадайте число від 1 до 10: ")) attempts += 1 if guess < secret_number: print("Занадто мало!") elif guess > secret_number: print("Занадто багато!") print(f"Вітаємо! Ви вгадали за {attempts} спроб.")
Обчислення факторіала
n = 5 factorial = 1 i = 1 while i <= n: factorial *= i i += 1 print(f"Факторіал {n} = {factorial}") # Факторіал 5 = 120
Зворотний відлік
seconds = 5 while seconds > 0: print(f"До старту: {seconds} секунд") seconds -= 1 print("Старт!") # До старту: 5 секунд # До старту: 4 секунд # До старту: 3 секунд # До старту: 2 секунд # До старту: 1 секунд # Старт!
Нескінченний цикл з умовою виходу
while True: user_input = input("Введіть 'вихід' для завершення: ") if user_input.lower() == "вихід": print("До побачення!") break print(f"Ви ввели: {user_input}")
Вкладені цикли (nested loops)
Використовує вкладені цикли для перебору комбінацій значень.
for i in range(3): for j in range(2): print(f"i={i}, j={j}") # i=0, j=0 # i=0, j=1 # i=1, j=0 # i=1, j=1 # i=2, j=0 # i=2, j=1
Практичні приклади вкладених циклів
Виведення прямокутника зірочками
rows = 3 cols = 5 for i in range(rows): for j in range(cols): print("*", end=" ") print() # перехід на новий рядок # * * * * * # * * * * * # * * * * *
Виведення трикутника
height = 5 for i in range(1, height + 1): for j in range(i): print("*", end=" ") print() # * # * * # * * * # * * * * # * * * * *
Таблиця множення (повна)
for i in range(1, 6): for j in range(1, 6): print(f"{i} × {j} = {i*j:2}", end=" | ") print() # 1 × 1 = 1 | 1 × 2 = 2 | 1 × 3 = 3 | 1 × 4 = 4 | 1 × 5 = 5 | # 2 × 1 = 2 | 2 × 2 = 4 | 2 × 3 = 6 | 2 × 4 = 8 | 2 × 5 = 10 | # 3 × 1 = 3 | 3 × 2 = 6 | 3 × 3 = 9 | 3 × 4 = 12 | 3 × 5 = 15 | # 4 × 1 = 4 | 4 × 2 = 8 | 4 × 3 = 12 | 4 × 4 = 16 | 4 × 5 = 20 | # 5 × 1 = 5 | 5 × 2 = 10 | 5 × 3 = 15 | 5 × 4 = 20 | 5 × 5 = 25 |
Перебір матриці (двовимірного списку)
matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] for row in matrix: for element in row: print(element, end=" ") print() # 1 2 3 # 4 5 6 # 7 8 9
Пошук у вкладених списках
students = [ ["Олена", "Максим", "Ірина"], ["Петро", "Марія", "Андрій"], ["Катерина", "Іван", "Софія"] ] search_name = "Марія" found = False for group_index, group in enumerate(students): for student_index, student in enumerate(group): if student == search_name: print(f"Знайдено {search_name} у групі {group_index + 1}, позиція {student_index + 1}") found = True break if found: break # Знайдено Марія у групі 2, позиція 2
Оптимізація циклів: list comprehensions
List comprehensions — це компактний спосіб створення списків з використанням циклів.
Базовий приклад
# Звичайний цикл squares = [] for i in range(5): squares.append(i ** 2) print(squares) # [0, 1, 4, 9, 16] # List comprehension squares = [i ** 2 for i in range(5)] print(squares) # [0, 1, 4, 9, 16]
List comprehension з умовою
# Парні числа від 0 до 10 even_numbers = [i for i in range(11) if i % 2 == 0] print(even_numbers) # [0, 2, 4, 6, 8, 10]
List comprehension з перетворенням
names = ["олена", "максим", "ірина"] capitalized = [name.capitalize() for name in names] print(capitalized) # ['Олена', 'Максим', 'Ірина']
Вкладені list comprehensions
# Створення матриці 3×3 matrix = [[i + j for j in range(3)] for i in range(0, 9, 3)] print(matrix) # [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
Поради щодо використання циклів
1. Уникайте нескінченних циклів
Погано:
i = 0 while i < 10: print(i) # Забули збільшити i — нескінченний цикл!
Добре:
i = 0 while i < 10: print(i) i += 1 # Не забувайте оновлювати змінну!
2. Використовуйте for коли знаєте кількість ітерацій
# Добре для відомої кількості ітерацій for i in range(10): print(i)
3. Використовуйте while для невизначеної кількості ітерацій
# Добре для умов, що залежать від введення користувача while user_input != "quit": user_input = input("Введіть команду: ")
4. Надавайте змінним описові назви
Погано:
for i in ["Олена", "Максим", "Ірина"]: print(i)
Добре:
for student in ["Олена", "Максим", "Ірина"]: print(student)
5. Використовуйте break для раннього виходу
numbers = [1, 2, 3, 4, 5, -1, 6, 7] for num in numbers: if num < 0: print("Знайдено від'ємне число!") break print(num)
Поширені помилки та як їх уникнути
Помилка 1: Зміна списку під час ітерації
Погано:
numbers = [1, 2, 3, 4, 5] for num in numbers: if num % 2 == 0: numbers.remove(num) # Небезпечно!
Добре:
numbers = [1, 2, 3, 4, 5] numbers = [num for num in numbers if num % 2 != 0] print(numbers) # [1, 3, 5]
Помилка 2: Забути збільшити лічильник у while
Погано:
count = 0 while count < 5: print(count) # Забули count += 1 — нескінченний цикл!
Добре:
count = 0 while count < 5: print(count) count += 1
Помилка 3: Неправильне використання range()
Погано:
# Не виведе 10 for i in range(10): print(i) # Виводить від 0 до 9
Добре:
# Щоб включити 10 for i in range(1, 11): print(i) # Виводить від 1 до 10