Логотип коледжу
Оптико-механічний фаховий коледж

Розгалуження та цикли

Лінійна програма виконує кожну команду один раз у записаному порядку. Реальні алгоритми мають обирати дію за умовою та повторювати дії. Наприклад, вимірювальна програма попереджає про насичення фотоприймача, повторює калібрування до потрібної точності або сканує точки оптичного поля.

Цілі лекції

Після опрацювання матеріалу ви зможете:

  • записувати розгалуження з if, elif, else;
  • будувати вкладені умови та короткий умовний вираз;
  • використовувати match як Python-відповідник оператора вибору switch;
  • обирати між циклами while і for;
  • правильно задавати межі в range;
  • керувати циклом за допомогою break і continue;
  • пояснювати небезпеку нескінченного циклу та передбачати безпечний вихід;
  • читати прості вкладені цикли.

Передумови

Потрібно знати змінні, числові типи, порівняння, логічні оператори та print. Важливо пам'ятати: результат умови має тип bool і дорівнює True або False.

1. Умова змінює шлях виконання

Оператор if перевіряє умову. Якщо вона істинна, виконується блок із відступом. elif додає наступну взаємовиключну перевірку, а else задає дію для всіх випадків, які залишилися.

Порівняння розгалуження та циклу в алгоритмі

Нехай фотоприймач повертає значення від 0 до 100. Класифікуємо сигнал:

intensity = 87

if intensity >= 95:
    print("Насичення фотоприймача")
elif intensity >= 60:
    print("Сильний сигнал")
elif intensity >= 20:
    print("Робочий діапазон")
else:
    print("Слабкий сигнал")

Результат:

Сильний сигнал

У ланцюжку перевірки виконуються умови зверху вниз, але спрацьовує лише перша істинна гілка. Тому межі тут розташовано від найбільшого значення до найменшого. Якби спочатку стояла умова intensity >= 20, значення 87 потрапило б до «робочого діапазону», а наступні гілки вже не перевірялися б.

Відступи є частиною синтаксису Python

Після if, elif та else ставлять двокрапку. Команди однієї гілки мають однаковий відступ, зазвичай чотири пробіли:

if intensity >= 95:
    print("Попередження")
    print("Зменште підсилення")

print("Перевірку завершено")

Останній print не має відступу, тому виконається незалежно від умови.

2. Вкладені умови

У гілці можна розмістити інше розгалуження. Це корисно, коли друга перевірка має сенс лише після першої. Наприклад, спочатку перевіримо допустимість вимірювання, а потім стан сигналу:

intensity = 87
sensor_ready = True

if sensor_ready:
    if intensity >= 95:
        print("Зменште експозицію")
    else:
        print("Вимірювання можна зберегти")
else:
    print("Датчик не готовий")

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

if sensor_ready and intensity < 95:
    print("Вимірювання можна зберегти")

3. Умовний, або тернарний, вираз

Коли потрібно обрати одне з двох значень, Python дозволяє короткий умовний вираз:

exposure_ms = 12
mode = "довга" if exposure_ms > 10 else "коротка"
print(mode)

Його читають так: значення "довга", якщо умова істинна, інакше "коротка". Такий запис доречний для простого вибору значення. Для кількох команд або складної логіки краще використовувати звичайний if.

4. Вибір серед відомих варіантів: match

У багатьох мовах оператор вибору називається switch. У Python 3.10+ подібну роль виконує match. Він особливо зручний, коли одне значення порівнюють із кількома точними варіантами.

filter_code = "G"

match filter_code:
    case "R":
        print("Червоний фільтр")
    case "G":
        print("Зелений фільтр")
    case "B":
        print("Синій фільтр")
    case _:
        print("Невідомий код")

У Python шаблон case _ відповідає будь-якому варіанту, який не збігся раніше. match має ширші можливості зіставлення зі структурою, але на цьому етапі достатньо використовувати його для чіткого вибору за фіксованими значеннями. Для діапазонів на кшталт intensity >= 95 ланцюжок if/elif зазвичай простіший.

5. Цикл while: повторення за умовою

while повторює блок, поки умова істинна. Він доречний, коли кількість повторень заздалегідь невідома. Наприклад, калібрування триває, поки похибка більша за допустиму:

error = 0.8
iteration = 0

while error > 0.1:
    iteration += 1
    error /= 2
    print(iteration, round(error, 2))

Результат:

1 0.4
2 0.2
3 0.1

У тілі циклу обов'язково має змінюватися щось, що впливає на умову. Інакше цикл може ніколи не завершитися.

У Python немає do-while

Цикл do-while в інших мовах спочатку виконує тіло, а потім перевіряє умову, тому тіло виконується хоча б один раз. Окремого синтаксису do-while у Python немає. За потреби його імітують циклом із явним виходом:

while True:
    value = float(input("Введіть додатну довжину хвилі: "))
    if value > 0:
        break
    print("Значення має бути додатним")

Цикл навмисно починається як нескінченний, але має зрозумілий безпечний вихід через break.

6. Цикл for і range

for зручний, коли відомо, скільки разів треба повторити дію. range(start, stop, step) створює послідовність цілих чисел:

  • start - перше значення, типово 0;
  • stop - межа, яка не входить до послідовності;
  • step - крок, типово 1.
for angle in range(0, 91, 30):
    print("Кут:", angle, "градусів")

Результат:

Кут: 0 градусів
Кут: 30 градусів
Кут: 60 градусів
Кут: 90 градусів

Значення 90 з'явилося тому, що верхню межу Python задано як 91. Типова помилка off-by-one («на одиницю більше або менше») виникає, коли забувають, що stop не входить до range.

Корисні форми:

ЗаписЗначення
range(4)0, 1, 2, 3
range(2, 6)2, 3, 4, 5
range(0, 7, 2)0, 2, 4, 6
range(5, 0, -1)5, 4, 3, 2, 1

7. break, continue та коротко про else циклу

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

У прикладі пропустимо некоректний нульовий кут і зупинимо пошук після першого кута, для якого сигнал досяг порога:

for angle in range(0, 91, 15):
    if angle == 0:
        continue

    signal = angle * 1.2
    print(angle, signal)

    if signal >= 60:
        print("Поріг досягнуто")
        break

Не слід використовувати break або continue замість зрозумілої умови без потреби: велика кількість дострокових переходів ускладнює читання алгоритму.

Python також дозволяє else після for або while. Цей блок виконується, якщо цикл завершився звичайно, тобто без break:

for step in range(1, 4):
    print("Перевірка", step)
else:
    print("Усі перевірки виконано")

Це корисна, але не обов'язкова конструкція. На початку можна записати ту саму логіку за допомогою окремої логічної змінної.

8. Нескінченні цикли та безпечний вихід

Нескінченний цикл не завершується сам. Він може бути помилкою:

count = 0
while count < 3:
    print(count)  # count не змінюється

Або свідомою частиною програми, яка очікує команди чи вимірювання. У такому разі потрібно передбачити шлях виходу:

while True:
    command = input("Команда (measure/exit): ")
    if command == "exit":
        print("Безпечне завершення")
        break
    if command != "measure":
        print("Невідома команда")
        continue
    print("Вимірювання виконано")

Перед запуском while перевірте три речі: початковий стан, умову продовження та зміну стану в тілі. Для навмисного while True назвіть конкретну подію, яка приводить до break.

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

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

for row in range(2):
    for column in range(3):
        print(f"Точка ({row}, {column})")

Внутрішній print виконається 2 * 3 = 6 разів. break усередині внутрішнього циклу завершив би лише внутрішній цикл, а не обидва. Вкладені цикли корисні, але кількість виконань швидко зростає: два цикли по 100 кроків дають 10 000 виконань внутрішньої команди.

10. Як обрати конструкцію

СитуаціяЗазвичай доречно
Виконати дію лише за умовиif
Обрати одну з кількох гілок за діапазонамиif / elif / else
Обрати за точним кодом або командоюmatch
Коротко обрати одне з двох значеньумовний вираз
Повторювати до досягнення умовиwhile
Виконати відому кількість кроківfor + range
Негайно припинити найближчий циклbreak
Пропустити поточну ітераціюcontinue
Перебрати комбінації двох лічильниківвкладені цикли

Підсумок

  • if, elif і else утворюють взаємовиключні гілки; порядок умов впливає на результат.
  • У Python відступ визначає межі блока.
  • Вкладена умова доречна, коли наступна перевірка залежить від попередньої.
  • Умовний вираз коротко обирає одне з двох значень, а match зручно вибирає за фіксованими варіантами.
  • while повторює дії за умовою, а for із range - за послідовністю цілих значень.
  • Верхня межа range не входить до послідовності, що часто спричиняє помилку off-by-one.
  • break завершує найближчий цикл, а continue пропускає решту поточної ітерації.
  • Python не має окремого do-while; виконання хоча б один раз можна організувати через while True із безпечним break.
  • Навмисний нескінченний цикл повинен мати чіткий шлях завершення.
  • У вкладених циклах кількість виконань внутрішнього блока дорівнює добутку кількостей ітерацій.

Завдання

1. Змінна `intensity` дорівнює `80`. Яке повідомлення виведе конструкція `if intensity >= 80`, якщо істинна гілка друкує «Висока», а гілка `else` - «Нормальна»?

2. Які значення послідовно набуває `step` у циклі `for step in range(1, 5)`?

3. Скільки разів виконається тіло циклу `n = 0; while n < 3: n += 1`? Запишіть лише число.

4. Що робить оператор `continue` всередині циклу?

5. Який оператор негайно припиняє найближчий цикл?

6. Скільки разів виконається `print("*")`, якщо зовнішній цикл перебирає `range(2)`, а вкладений у нього внутрішній цикл - `range(3)`? Запишіть лише число.