Теоретичні відомості#

Цикли – це інструкції, які виконують одну й туж послідовність дій, покидіє задана умова. Типова блок-схема циклу показана на рис. 1.3.

for loop block scheme

Рисунок 1.3. — Блок-схема циклічного процесу.

За побудовою цикли ділять на цикли типу арифметичної прогресії і ітерації. Цикл типу арифметичної прогресії має відоме кінцеве число повторень (for). У циклі типу ітерації число повторень невідомо (while).

Цикл for#

Цикл for, також називається циклом з параметром, в мові Python багатий можливостями. У циклі for вказується змінна і множина значень, за яким буде пробігати змінна. Множина значень може бути задана списком, кортежем, рядком або діапазоном.

Формальне визначення циклу for:

for <int_var> in <iterable_range>:
    <інструкції>

Після ключового слова for йде змінна int_var, яка зберігає цілі числа (назва змінної може бути будь-якою), потім ключове слово in, ітератор (наприклад, виклик функції range) і двокрапка. А з наступного рядка розташовується блок інструкцій циклу, які також повинні мати відступи від початку рядка. Ось простий приклад використання циклу, де в ролі множини значень використовується кортеж:

i = 1

for color in 'red','orange','yellow','green','cyan','blue', 'violet':
    print('#', i,' color of rainbow is ', color, sep='')
    i+=1
#1 color of rainbow is red
#2 color of rainbow is orange
#3 color of rainbow is yellow
#4 color of rainbow is green
#5 color of rainbow is cyan
#6 color of rainbow is blue
#7 color of rainbow is violet

У цьому прикладі змінна color послідовно приймає значення 'red', 'orange' і т.д. У тілі циклу виводиться повідомлення, яке містить назву кольору, тобто значення змінної color, а також номер ітерації циклу число, яке спочатку дорівнює 1, а потім збільшується на один (інструкцією i += 1) з кожним проходом циклу. Інструкція i += 1 еквівалентна конструкції i = i + 1 (це просто скорочений запис). Такий скорочений запис можна використовувати для всіх арифметичних операцій: *=, -=, /=, %=

У списку значень можуть бути вирази різних типів, наприклад:

for i in 1, 2, 3, 'one', 'two', 'three':
    print(i)
1
2
3
one
two
three

При перших трьох ітераціях циклу змінна i буде приймати значення типу int, при наступних трьох — типу str.

При виконанні циклу Python послідовно отримує всі значення з колекції і зберігає їх у змінній int_var. При першому проході цикл отримує перше значення з колекції, при другому — друге значення і так далі, поки не перебере їх усі. Коли всі значення у колекції будуть перебрані, цикл завершує свою роботу.

Функция range#

Як правило, цикли for використовуються або для повторення будь-якої послідовності дій задану кількість разів, або для зміни значення змінної в циклі від деякого початкового значення до деякого кінцевого. Для повторення циклу деяке задане число разів n можна використовувати цикл for разом з функцією range:

for i in range(4):
# рівносильно інструкції 
# for i in 0, 1, 2, 3:
    # тут можна виконувати циклічні дії
    print(i)
    print(i**2)
# цикл закінчився, оскільки закінчився блок з відступом 
print('Кінець циклу')
0
0
1
1
2
4
3
9
Кінець циклу

Функція range має такі форми:

  • range(stop): повертає всі цілі числа від 0 до stop;

  • range(start, stop): повертає всі цілі числа в проміжку від [start, stop);

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

Приклади викликів функції range:

range(5)          # 0,1,2,3,4
range(1,5)        # 1,2,3,4
range(2,10,2)     # 2,4,6,8
range(5,0,-1)     # 5,4,3,2,1
range(5, 0, -1)

Наприклад, виведемо послідовно всі числа від 0 до 4:

for i in range(5):
    print(i, end=" ")
0 1 2 3 4 

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

Одні цикли всередині себе можуть містити інші цикли. Розглянемо на прикладі виведення таблиці множення:

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

2	4	6	8	10	12	14	16	18	

3	6	9	12	15	18	21	24	27	

4	8	12	16	20	24	28	32	36	

5	10	15	20	25	30	35	40	45	

6	12	18	24	30	36	42	48	54	

7	14	21	28	35	42	49	56	63	

8	16	24	32	40	48	56	64	72	

9	18	27	36	45	54	63	72	81	

Зовнішній цикл for i in range(1, 10) спрацьовує 9 разів, так як в колекції, яка повертається функцією range, 9 чисел. Внутрішній цикл for j in range(1, 10) спрацьовує 9 разів для однієї ітерації зовнішнього циклу, і відповідно 81 разів для всіх ітерацій зовнішнього циклу. У кожній ітерації внутрішнього циклу на консоль буде виводитися добуток чисел i та j.

Цикл while#

Універсальним організатором циклу в мові програмування Python (як і в багатьох інших мовах) є конструкція while. Слово “while” з англійської мови перекладається як “поки” (як у фразі “поки логічне вираження повертає істину, виконувати певні операції”). Конструкцію while на мові Python можна описати наступною схемою:

while <логічний_вираз>:
    <інструкції>

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

Коли виконання програмного коду доходить до циклу while, виконується логічний вираз в заголовку, і, якщо було отримано True (істина), виконуються вкладені вирази. Після потік виконання програми знову повертається в заголовок циклу while, і знову перевіряється умова. Якщо умова ніколи не буде хибною, то не буде причин зупинки циклу і програма зациклиться. Щоб цього не сталося, необхідно передбачити можливість виходу з циклу — хибність виразу в заголовку. Таким чином, змінюючи значення змінної в тілі циклу, можна довести логічний вираз до хибності.

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

str1 = "+" 
i = 0
while i < 10:
	print(str1)
	i = i + 1
+
+
+
+
+
+
+
+
+
+

В останньому рядку коду відбувається збільшення значення змінної i на одиницю, тому з кожним оборотом циклу її значення збільшується. Коли буде досягнуто число 10, логічний вираз i < 10 дасть помилковий результат, виконання тіла циклу буде припинено, а потік виконання програми перейде на команди, які йдуть за всією конструкцією циклу. Результатом виконання скрипта, наведеного вище, є вивід на екран десяти знаків + в стовпчик. Якщо збільшувати лічильник в тілі циклу не на одиницю, а на 2, то буде виведено лише п’ять знаків, тому що цикл зробить тільки п’ять оборотів. Всі інструкції, які відносяться до циклу while, розташовуються на окремих рядках і повинні мати відступ від початку рядка.

choice = "y"
while choice.lower() == "y":
    print("Привіт")
    choice = input("Для продовження натисніть Y, а для виходу іншу клавішу: ")
print("Робота програми завершена ")
Привіт
Привіт
Робота програми завершена 

В даному випадку цикл while триватиме, поки змінна choice містить латинську букву "Y" або "y". Сам блок циклу складається з двох інструкцій. Спочатку виводиться повідомлення “Привіт”, а потім уводиться нове значення для змінної choice. І якщо користувач натисне якусь іншу клавішу, відмінну від Y, відбудеться вихід з циклу, так як умова choice.lower () == "y" поверне значення False.

Кожен такий прохід циклу називається ітерацією. Також зверніть увагу, що остання інструкція print("Робота програми завершена") не має відступів від початку рядка, тому вона не входить в цикл while. Істотна відмінність циклу while від циклу for: while використовується тоді, коли заздалегідь невідомо, скільки разів має повторюватися деяка дія.

Вихід із циклу, break і continue#

Для управління циклом можна використовувати спеціальні оператори break і continue. Оператор break здійснює вихід з циклу. А оператор continue виконує перехід до наступної ітерації циклу. Оператор break може використовуватися, якщо в циклі утворюються умови, які несумісні з його подальшим виконанням.

Приклад:

print("Для виходу натисніть Y")
while True:
    data = input("Уведіть суму для обміну: ")
    if data.lower() == "y":
        break # вихід з циклу
    money = int(data)
    cache = round(money/26,2)
    print("До видачі ", cache, "доларів ")
print("Робота обмінного пункту завершена ")
Для виходу натисніть Y
До видачі  0.38 доларів 
Робота обмінного пункту завершена 

Тут продемонстровано нескінченний цикл, так як умова while True завжди істинна і завжди буде виконуватися. Це популярний прийом для створення програм, які повинні виконуватися невизначено довго.

У самому циклі отримуємо введення з консолі. Передбачається, що користувач буде вводити число — умовну суму грошей для обміну. Якщо користувач вводить літеру "Y" або "y", то за допомогою оператора break виходимо з циклу. Інакше ділимо його на обмінний курс, за допомогою функції round округляється результат і виводиться на консоль. І так до нескінченності, поки користувач не захоче вийти з програми, натиснувши на клавішу Y.

Але що, якщо користувач введе від’ємне число? У цьому випадку програма також видасть від’ємний результат, що не є коректною поведінкою. І в цьому випадку перед обчисленням можна перевірити значення, менше воно нуля, і якщо менше, за допомогою оператора continue виконати перехід до наступної ітерації циклу без його завершення:

print ("Для виходу натисніть Y")
while True:
    data = input ("Уведіть суму для обміну:")
    if data.lower () == "y":
        break # вихід з циклу
    
    money = int (data)
    if money < 0:
        print ("Сума повинна бути додатньою!")
        continue
    
    cache = round (money / 26, 2)
    print ("До видачі", cache, "доларів")
print ("Робота обмінного пункту завершена")
Для виходу натисніть Y
Сума повинна бути додатньою!
До видачі 384.62 доларів
Робота обмінного пункту завершена

І в цьому випадку не можна отримати результат для від’ємної суми.