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

| | 0 Comments| 12:59 PM
Categories:

У цьому посібнику ви дізнаєтесь, як емулювати цикл do-while у Python.

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

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

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

Що таке конструкція циклу Do-While?

Якщо ви програмували на таких мовах, як C або C++, ви, мабуть, натрапили на конструкцію циклу do-while.

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

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

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

//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. Однак цикл виконується один раз, навіть якщо спочатку умова циклу False.
  • Це на відміну від циклу while, який виконується, лише якщо умова циклу має значення True.
//while_example1

#include <stdio.h>

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

    return 0;
}

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

Output

While loop: 
//loop body does not run!

Поки проти 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 циклів, де умова циклу має значення True. На ітерації номер K+1 умова стає False, і елемент керування виривається з циклу.

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

Тож чому це незначне покращення корисне?🤔

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

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

Поки проти Do-While Резюме

Давайте зведемо в таблицю ключові відмінності, про які ми дізналися. 👩‍🏫

Поки LoopDo-While Loop Перевірка умови циклу: перед виконанням тіла циклу Перевірка умови циклу: після виконання тіла циклу. Якщо спочатку умова False, тіло циклу не виконується. Якщо спочатку умова False, тіло циклу виконується рівно один раз. Умова циклу перевіряється K разів, коли K проходить через цикл. Умова циклу перевіряється K-1 разів, коли K проходить через цикл. Коли використовувати цикл while?
– Цикл має працювати до тих пір, поки умова має значення True
– Для шлейфів з регульованим входом
– Коли умова циклу не вимагає обчислень. Коли використовувати цикл do-while?
– Цикл має виконуватися принаймні один раз для початкової умови циклу False
– Для петель з контрольованим виходом
– Коли умова циклу вимагає обчислень

  Установіть CyanogenMod 11 на Nexus 5

Емуляція поведінки циклу Do-While у Python

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

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

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

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

while True:
    pass

# Instead of True, you can have any condition that is always True

while always-True-condition:
   pass

Оператор break можна використовувати для виходу з тіла циклу та передачі керування першому оператору поза тілом циклу.

while <condition>:
    if <some-condition>:
        break

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

Ось емуляція циклу do-while у Python:

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

Приклади Python Do-While Loop

Ми переглянемо приклади з попереднього розділу та перепишемо їх на 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.

  Відстежуйте, видаляйте та захищайте надіслані вкладення Gmail за допомогою docTrackr

Код має пропонувати користувачеві ввести дані, незалежно від того, правильна чи неправильна його припущення. Ми можемо зробити це за допомогою нескінченного циклу 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 виривається з циклу, коли користувач правильно вгадує секретне число.

    # Sample output when secret_number = 43 and user gets it right!
    
    Guess a number:4
    
    Guess a number:3
    
    Guess a number:43
    Congrats, you guessed it right!
    

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

    # Sample output when secret_number = 33 and user fails to guess it right!
    
    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 <умова>, так що умова завжди є True.
    • Перевірте умову виходу всередині циклу та скористайтеся інструкцією break, щоб вийти з циклу за певної умови.

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