Розгалуження та цикли
Лінійна програма виконує кожну команду один раз у записаному порядку. Реальні алгоритми мають обирати дію за умовою та повторювати дії. Наприклад, вимірювальна програма попереджає про насичення фотоприймача, повторює калібрування до потрібної точності або сканує точки оптичного поля.
Цілі лекції
Після опрацювання матеріалу ви зможете:
- записувати розгалуження з
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. - Навмисний нескінченний цикл повинен мати чіткий шлях завершення.
- У вкладених циклах кількість виконань внутрішнього блока дорівнює добутку кількостей ітерацій.
