Цикли 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 дорівнює 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 дорівнює 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. у підсумку ми отримаємо наступний консольний висновок:
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.
Консольний висновок програми:
Введіть суму для обміну: 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, знову ж використовуються відступи.
І в цьому випадку ми вже не зможемо отримати результат для негативної суми:
Введіть суму для обміну: -20000
Сума повинна бути позитивною!
Введіть суму для обміну: 20000
До видачі 357.14 доларів
Введіть суму для обміну: y
Робота обмінного пункту завершена