article banner

Цикли на Python

Це фрагмент книги Python з нуля, яка допоможе вам навчитися програмуванню з нуля. Ви можете знайти його на Allegro, Empik та в інтернет-книгарнях.

Як ми вже говорили в попередніх розділах, кожен рядок коду є інструкцією. Вони своєю чергою виконуються послідовно зверху вниз.

print("Це буде виведено спочатку,")
print("а це потім")
# Виведе:  
# Це буде виведено спочатку,  
# а це потім

Порядок виконання інструкцій називається потоком керування. Це важливо, оскільки певні інструкції змінюють цей потік. Ми вже бачили одну з них — інструкція if дозволяє нам пропустити частину коду, якщо не виконується певна умова. Однак досі ми не могли змусити одну команду виконуватися більше одного разу. Цей бар’єр ми подолаємо зараз за допомогою використання циклів.

Цикл while

Визначення циклу while мало чим відрізняється від умови if. Змінюється лише ключове слово if на while. Поведінка також певною мірою подібна.

Якщо умова не виконується (повертає False), тоді тіло пропускається (подібно до того, як у випадку умови if).

while False:
    print("Цей текст ніколи не буде виведено")

if False:
    print("Цей текст ніколи не буде виведено ")
	
# Нічого не буде виведено

Однак, якщо умова виконується (повертає True), тіло буде викликатися. Тут while відрізняється від if тим, що ми послідовно перевіряємо умову і, якщо вона все ще виконується, знову викликаємо тіло. Ми повторюємо цей процес, доки умова не поверне False.

У наступному випадку перша умова буде виконана тільки один раз, оскільки в тілі ми змінюємо значення змінної should_print на False. Друга буде виконана тричі, тому що в тілі ми збільшуємо значення змінної, доки її значення не буде більше, ніж 2.

should_print = True
while should_print:
    print("Буде виведено лише раз")
    should_print = False

# Виведе:    
# Буде виведено лише раз

printed_times = 0
while printed_times <= 2:
    print(f"Виведене для {printed_times}")
    printed_times += 1
    # в іншому разі printed_times = printed_times + 1

# Виведе:
# Виведене для 0
# Виведене для 1
# Виведене для 2

Повертаючись до історії Мишка, можна використати цикл, щоб записати вказівку його мами: "Ти будеш писати твір, доки не закінчиш".

while not essey_finished:
    write_essey()

Якщо ми поставимо в цикл умову, яка виконуватиметься завжди, цикл працюватиме нескінченно. Наступна програма ніколи не припинить друкувати "LOL" (доки буде увімкнена).

# Виписуватиме нескінченно
while True:
    print("LOL")

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

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

i = 3
while i <= 10:
    print(i)
    i += 3  # або i = i + 3

# Виведе:
# 3
# 6
# 9

Якщо б ми хотіли виписати по порядку числа, які є наступними степенями 2 (де кожен наступний елемент утворюється шляхом подвоєння попереднього), ми могли б використати такий цикл:

i = 1
while i <= 100:
    print(i)
    i *= 2  # або i = i * 2

# Виведе:
# 1
# 2
# 4
# 8
# 16
# 32
# 64

Вправа: Математичні послідовності

  • Виведи послідовні парні числа (кратні 2), починаючи з 0, які менші ніж 100.
  • Виведи послідовні числа, кратні 7, починаючи з 0, які менші ніж 100.
  • Виведи послідовні значення, утворені в результаті потроєння числа кілька разів, починаючи з 13, доки результат буде меншим ніж 1000.
  • Виведи квадрати послідовних цілих чисел, які менші ніж 1000.

Відповіді в кінці книги.

Цикл for

Ще один цикл, який часто використовується, — цикл for. У наступних частинах цієї книги ми побачимо, що він використовується в основному для виконання операції для кожного з елементів списку:

names = ["Аля", "Бася", "Целіна"]
for name in names:
    print("Наступне ім’я — " + name)

# Виведе:
# Наступне ім’я — Аля
# Наступне ім’я — Бася
# Наступне ім’я — Целіна

Однак перед тим, як перейти до списків, поговорімо про дещо інше використання циклу for, а саме для виконання операцій з послідовними числами. Для цього в правій частині ми повинні використати функцію 1 range, яка задає діапазон чисел. Якщо ми використаємо її з одним числом, вона позначатиме, скільки чисел міститиме діапазон. Отже, якщо ми використаємо for i in range(5), то тіло циклу буде викликано рівно 5 разів. Але які значення прийматиме змінна і? Ітерація 2 за замовчуванням починається з 0, тому, якщо ми викликаємо range(5), тоді ми викличемо тіло циклу для чисел від 0 до 4. Завдяки цьому є 5 чисел: якби ми почали з 0 і закінчили на 5, тіло було би викликано 6 разів. Оскільки ми починаємо з 0, ми закінчуємо безпосередньо перед числом, заданим як аргумент функції range.

for i in range(5):
    print(i)

# Виведе:
# 0
# 1
# 2
# 3
# 4

В тілі циклу можна помістити багато інструкцій.

for i in range(3):
    print(f"Лишилося {3 — i} соки")
    print("Ковть ковть ковть")
	
print("Соку вже немає")

# Виведе:
# Лишилося 3 соки
# Ковть ковть ковть
# Лишилося 2 соки
# Ковть ковть ковть
# Лишилося 1 соки
# Ковть ковть ковть
# Соку вже немає

Якщо аргумент функції range менше ніж 1, нічого не буде виведено.

for i in range(0):
    print(i)

# Нічого не буде виведено

Початкове значення

Ми можемо також викликати функцію range з двома числами, розділеними комою. Перша з них визначатиме, з якого числа ми повинні почати ітерацію, а друга — перед якою ми маємо її закінчити. Таким чином range(3) містить 0, 1 і 2, тоді як range(1, 3) містить тільки 1 і 2, тому що ми починаємо відлік з 1 і закінчуємо до 3.

for i in range(1, 3):
    print(i)

# Виведе:
# 1
# 2
for i in range(2, 5):
    print(i)

# Виведе:
# 2
# 3
# 4

Якщо кінцеве обмеження буде меншим або рівним початковому значенню, нічого не буде виведено.

for i in range(5, 5):
    print(i)

Крок

У функції range ми можемо поставити ще один аргумент, а саме крок. Це число, на яке змінюється початкове значення під час наступних викликів. За замовчуванням це 1, тому, наприклад, між 1 та 6 ми йдемо число за числом. Однак, якщо ми змінимо значення кроку на 2, то побачимо кожне друге число, починаючи з 1, після чого зупинимося перед 6.

for i in range(1, 6, 2):
    print(i)

# # Виведе:
# 1
# 3
# 5

Якщо ми встановимо від’ємне значення кроку, відлік піде в іншу сторону.

for i in range(10, 0, -2):
    print(i)

# # Виведе:
# 10
# 8
# 6
# 4
# 2

Вправа: Використання циклів for для чисел

З використанням циклу for:

  • виведи 5 послідовних чисел, починаючи з 0;
  • виведи по черзі числа, починаючи з 5, які менші за 10;
  • виведи кожне четверте число від 5 до 30;
  • виведи по черзі числа від 10 до 5 (без 5);
  • виведи кожне друге число від 20 до 0 (без 0).

Відповіді в кінці книги.

Завершення

Цикли — це дуже корисний і функціонал мови Python, який часто використовується. Знати та розуміти їх дуже зручно. Ми ж перейдемо до ключового функціоналу сучасних проєктів програмування, який багатьма експертами описується як найважливіший у мовах програмування. Час поговорити про функції.

1:

З функціями ми познайомимося ближче в наступному розділі.

2:

Ітерація (лат. iteratio — повторення) — це повторення тієї самої операції в циклі заздалегідь визначену кількість разів або до виконання певної умови.