Цикли Python

Цикли дозволяють повторювати деяку дію в залежності від дотримання деякої умови.

Цикл while

Перший цикл, який ми розглянемо, це цикл while. Він має наступне формальне визначення:

while условное_выражение:  
    інструкція  

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

Всі інструкції, які відносяться до циклу while, розташовуються на наступних рядках і повинні мати відступ від початку рядка.

choice = "y"     

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

В даному випадку цикл while триватиме, поки змінна choice містить латинську букву " Y " або "y".

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

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

Дугий приклад - обчислення факторіалу:

#! Програма з обчислення факторіалу     

number = int(input("Введіть число: "))  
i = 1  
factorial = 1  
while i <= number:  
    factorial *= i  
    i += 1  
print("Факторіал числа", number, "дорівнює", factorial)  ​

Тут вводить з консолі деяке число, і поки число-лічильник i не буде більше введеного числа, буде виконуватися цикл, в якому відбувається множення числа factorial.

Консольний висновок:

Введіть число: 6
Факторіал числа 6 дорівнює 720

Цикл for

Інший тип циклів представляє конструкція for. Цикл for викликається для кожного числа в деякій колекції чисел. Колекція чисел створюється за допомогою функції range(). Формальне визначення циклу for:

для int_var в функция_гапде:  
    інструкція 

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

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

Розглянемо на прикладі обчислення факторіалу:

#! Програма з обчислення факторіалу     

number = int(input("Введіть число: "))  
factorial = 1  
for i in range(1, number+1):  
    factorial *= i  
print("Факторіал числа", number, "дорівнює", factorial) ​

Спочатку вводимо з консолі число. У циклі визначаємо змінну i, в яку зберігаються числа з колекції, що створилися функцією range.

Функція range тут приймає два аргументи - початкове число колекції (тут число 1) і число, до якого треба додавати числа (тобто number +1).

Припустимо, з консолі вводиться число 6, то виклик функції range набуває наступну форму:

range(1, 6+1):  

Ця функція буде створювати колекцію, яка буде починатися з 1 і послідовно наповнюватися цілими числами аж до 7. Тобто це буде колекція [1, 2, 3, 4, 5, 6].

При виконанні циклу із цієї колекції послідовно будуть передаватися числа в змінну i, а в самому циклі буде відбуватися множення змінної i на змінну factorial. У підсумку ми отримаємо Факторіал числа.

Консольний висновок програми:

Введіть число: 6
Факторіал числа 6 дорівнює 720

Функція range

Функція 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 

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

for i in range(5):  
    print(i, end=" ") 

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

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

for i in range(1, 10):  
    for j in range(1, 10):  
        print(i * j, end="\t")  
    print("\n")

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

У кожній ітерації внутрішнього циклу на консоль буде виводиться добуток чисел i І j. у підсумку ми отримаємо наступний консольний висновок:

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

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

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

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

#! Програма Обмінний пункт     

print("Для виходу натисніть Y")     

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

print("Робота обмінного пункту завершена")  

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

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

Консольний висновок програми:

Для виходу натисніть Y
Введіть суму для обміну: 20000
До видачі 357.14 доларів
Введіть суму для обміну: Y
Робота обмінного пункту завершена

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

#! Програма Обмінний пункт     

print("Для виходу натисніть Y")     

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

print("Робота обмінного пункту завершена") 

Також звертаю увагу, що для визначення, чи належить інструкція до блоку while або до вкладеної конструкції if, знову ж використовуються відступи.

І в цьому випадку ми вже не зможемо отримати результат для негативної суми:

Для виходу натисніть Y
Введіть суму для обміну: -20000
Сума повинна бути позитивною!
Введіть суму для обміну: 20000
До видачі 357.14 доларів
Введіть суму для обміну: y
Робота обмінного пункту завершена