Як емулювати цикли Do-While у Python

Як імітувати цикл do-while в Python

У цій інструкції ви навчитеся відтворювати поведінку циклу do-while, якого немає в Python, використовуючи наявні інструменти.

В різних мовах програмування цикли дозволяють багаторазово виконувати фрагменти коду в залежності від певних умов. Python пропонує цикли while і for, але не має циклу do-while.

Однак, розуміючи принцип роботи циклу do-while, можна імітувати його, використовуючи доступні в Python цикли та оператори керування виконанням.

Протягом найближчих хвилин ми розглянемо, як це можна зробити. Почнімо!

Що таке цикл do-while?

Якщо ви маєте досвід програмування на C чи C++, ви напевно знайомі з конструкцією циклу do-while.

У циклі do-while спочатку виконуються інструкції в тілі циклу – всередині блоку, обмеженого фігурними дужками, а вже потім перевіряється умова циклу.

Ви можете запустити наведені нижче приклади коду C безпосередньо у вашому браузері, використовуючи онлайн-компілятор C.

Розгляньмо наступний код:

//do_while_example1

#include <stdio.h>

int main() {
    int count = 1;
    printf("Do-While loop: n");
    
    do{
        printf("Loop runs...");
        }while(count<0);

    return 0;
}

Результат виконання:

Output

Do-While loop: 
Loop runs...

В наведеному вище прикладі:

  • Змінна `count` має значення 1, а умова циклу `count < 0`. Але цикл виконується один раз, навіть якщо умова спочатку хибна.
  • Це відрізняється від циклу while, який виконується лише тоді, коли умова циклу істинна.
//while_example1

#include <stdio.h>

int main() {
    int count = 1;
    printf("While loop: n");
    
    while(count<0){
        printf("Loop runs...");
        }

    return 0;
}

Як вже згадувалось, умова циклу `count < 0` є хибною, оскільки `count` спочатку дорівнює 1. Тому, після компіляції і запуску коду, оператор в тілі циклу while не виконується.

Output

While loop: 
//loop body does not run!

Порівняння циклів while і do-while

Давайте детальніше проаналізуємо відмінності між циклами while і do-while.

Розгляньмо цей приклад:

//do_while_example2

#include <stdio.h>

int main() {
    int count = 1;
    printf("Do-while loop: n");
    
    do{
       printf("%dn",count);
       count++;
    }while(count<5);

    return 0;
}

У цьому коді:

  • Змінна `count` ініціалізується значенням 1.
  • Використовується цикл do-while.
  • Змінна `count` збільшується на 1 з кожною ітерацією циклу, а умова циклу – `count < 5`.

Ось візуальне представлення виконання циклу do-while: цикл виконується щонайменше один раз, потім умова циклу перевіряється чотири рази.

Output

Do-while loop: 
1
2
3
4

Якщо замість цього використовувати цикл while, отримаємо наступне:

//while_example2

#include <stdio.h>

int main() {
    int count = 1;
    printf("While loop: n");
    
    while(count<5){
       printf("%dn",count);
       count++;
    };

    return 0;
}

На зображенні нижче показано виконання циклу while. В цьому випадку цикл while перевіряє умову п’ять разів.

Output

While loop: 
1
2
3
4

Хоча результати виконання циклів while і do-while ідентичні, існують деякі важливі відмінності.

У циклі while спочатку перевіряється умова, а потім виконується тіло циклу. Тобто, якщо ви хочете, щоб цикл виконавсь K разів, має бути рівно K ітерацій, де умова циклу істинна. На (K+1)-й ітерації умова стає хибною, і керування переходить за межі циклу.

У випадку з циклом do-while умова циклу перевіряється K-й раз лише після того, як тіло циклу виконалось K разів.

Чому ця, на перший погляд, незначна відмінність є корисною? 🤔

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

В такому випадку для K ітерацій тіла циклу вигідніше використовувати цикл do-while.

Підсумки порівняння циклів while і do-while

Підсумуємо основні відмінності, які ми розглянули. 👩‍🏫

Характеристика Цикл while Цикл do-while
Перевірка умови циклу Перед виконанням тіла циклу Після виконання тіла циклу
Початкове виконання Якщо умова хибна на початку, тіло циклу не виконується Якщо умова хибна на початку, тіло циклу виконується рівно один раз
Кількість перевірок умови Умова перевіряється K разів при K ітераціях Умова перевіряється K-1 раз при K ітераціях
Коли використовувати while Цикл має працювати доки умова істинна, цикл з регульованим входом, умова не вимагає обчислень Цикл має виконатися хоча б один раз, цикл з регульованим виходом, умова вимагає обчислень

Імітація поведінки циклу do-while в Python

З попереднього розділу ми знаємо, що для відтворення циклу do-while в Python потрібні наступні умови:

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

Нескінченний цикл while і оператор break у Python

Ви можете створити нескінченний цикл while в Python, як показано нижче:

while True:
    pass

# Замість True, ви можете використати будь-яку умову, що завжди істинна

while always-True-condition:
   pass

Оператор `break` дозволяє завершити виконання циклу та перейти до першого оператора за його межами.

while <умова>:
    if <деяка_умова>:
        break

У першому прикладі циклу do-while на C умовою продовження циклу була `count < 0`. Отже, умова для виходу з циклу – це коли значення лічильника стає більшим або дорівнює нулю (`count >= 0`).

Ось як можна імітувати цикл do-while в Python:

count = 1
while True:
    print("Loop runs...")
    if(count >= 0):
        break

Приклади імітації циклу do-while в Python

Розглянемо приклади з попередніх розділів та перепишемо їх на Python, імітуючи цикл do-while.

#1. Повернемось до прикладу виведення значень змінної `count`, поки `count` менше п’яти.

Ми знаємо, як створити нескінченний цикл, щоб тіло циклу виконалось хоча б один раз.

Цикл повинен тривати доки рахунок буде менше п’яти. Отже, коли кількість дійде до п’яти, ми повинні завершити цикл. Тобто `count == 5` є умовою виходу.

Зібравши все разом, отримаємо:

count = 1
while True:
  print(f"Count is {count}")
  count += 1
  if count==5:
    break
Output

Count is 1
Count is 2
Count is 3
Count is 4

#2. Ми також можемо переписати гру у вгадування числа як конструкцію Python do-while.

У грі у вгадування чисел ми перевіряємо введене користувачем число на відповідність заздалегідь визначеному секретному числу. Користувач має вгадати секретне число за певну максимальну кількість спроб, скажімо, `max_guesses`.

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

Отже, коли ми маємо завершити цикл?

Цикл має завершитись в одному з наступних випадків:

  • Коли користувач вгадав число.
  • Коли користувач не вгадав число, але вичерпав усі дозволені спроби. Кількість неправильних спроб користувача досягла `max_guesses`.

Наступний код демонструє, як це зробити.

import random

low, high = 5,50

secret_number = random.choice(range(low,high))

max_guesses = 10

num_guesses = 0

while True:
    guess = int(input("nGuess a number:"))
    num_guesses += 1
    
    conditions = [num_guesses==max_guesses,guess==secret_number]
    
    if any(conditions):
        break

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

import random

low, high = 5,50

secret_number = random.choice(range(low,high))

print(secret_number)

max_guesses = 10

num_guesses = 0

while True:
    guess = int(input("nGuess a number:"))
    num_guesses += 1
    
    if guess==secret_number:
        print("Congrats, you guessed it right!")
        break
    if num_guesses==max_guesses:
        print("Sorry, you have no more guesses left!")
        break

Нижче наведено приклади результатів.

В цьому прикладі оператор `break` завершує цикл, коли користувач правильно вгадує секретне число.

# Приклад виводу, коли secret_number = 43, і користувач вгадує число!

Guess a number:4

Guess a number:3

Guess a number:43
Congrats, you guessed it right!

Ось ще один приклад результату, коли користувач досягає максимальної кількості спроб, але не вгадує секретне число.

# Приклад виводу, коли secret_number = 33, і користувач не вгадав число!

Guess a number:3

Guess a number:15

Guess a number:21

Guess a number:50

Guess a number:17

Guess a number:6

Guess a number:18

Guess a number:5

Guess a number:12

Guess a number:43
Sorry, you have no more guesses left!

Висновок

Сподіваюся, цей посібник допоміг вам зрозуміти, як імітувати цикл do-while в Python.

Основні висновки:

  • Використовуйте нескінченний цикл, щоб забезпечити хоча б одноразове виконання тіла циклу. Це може бути звичайний нескінченний цикл, наприклад `while True`, або `while <умова>`, де умова завжди істинна.
  • Перевірте умову виходу всередині циклу і використовуйте оператор `break` для виходу з циклу за певних умов.

Далі дізнайтеся, як використовувати цикли for та функцію `enumerate()` в Python.