Jak emulować pętle Do-While w Pythonie?

W tym samouczku dowiesz się, jak emulować pętlę do while w Pythonie.

W każdym języku programowania pętle pomagają w powtarzaniu pewnych działań, w zależności od warunku zapętlenia. Python obsługuje konstrukcje pętli while i for, ale natywnie nie obsługuje pętli do-while.

Możesz jednak emulować pętlę do-while, rozumiejąc, jak to działa — używając istniejących pętli i instrukcji sterujących pętli w Pythonie.

W ciągu kilku minut dowiesz się, jak to zrobić. Zaczynajmy!

Co to jest konstrukcja pętli Do-While?

Jeśli programowałeś w językach takich jak C lub C++, prawdopodobnie natknąłbyś się na konstrukcję pętli do-while.

W pętli do-while zestaw instrukcji w treści pętli — w bloku ograniczonym nawiasami klamrowymi — jest wykonywany jako pierwszy, a następnie sprawdzany jest warunek pętli.

Możesz uruchomić następujące przykłady C w internetowym kompilatorze C wdzzwdz — bezpośrednio z przeglądarki.

Rozważ następujący fragment kodu:

//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;
}

Oto wynik.

Output

Do-While loop: 
Loop runs...

W powyższym przykładzie:

  • Wartość count to 1, a warunek zapętlenia to count < 0. Jednak pętla uruchamia się raz, mimo że początkowo warunek pętli jest fałszywy.
  • Jest to w przeciwieństwie do pętli while, która jest wykonywana tylko wtedy, gdy warunek pętli jest w pierwszej kolejności True.
//while_example1

#include <stdio.h>

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

    return 0;
}

Jak wspomniano, warunek pętli, liczba < 0 jest fałszem, początkowo zmienna count jest inicjowana na 1. Tak więc po skompilowaniu i uruchomieniu powyższego kodu widzimy, że instrukcja w treści pętli while nie jest wykonywana.

Output

While loop: 
//loop body does not run!

While vs. Do-While: przegląd różnic

Przyjrzyjmy się bliżej różnicom między pętlami while i do-while.

Rozważmy ten przykład:

//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;
}

W powyższej komórce kodu:

  • Zmienna count jest inicjowana na 1.
  • Używamy pętli do-while.
  • Zmienna count jest zwiększana o 1 podczas każdego przejścia przez pętlę, a warunek pętli jest ustawiony na count < 5.

Oto wizualne wyjaśnienie, w jaki sposób odbywa się wykonanie: jak działa pętla do-while i czterokrotnie sprawdza warunek zapętlenia.

Output

Do-while loop: 
1
2
3
4

Jeśli zamiast tego użyjesz pętli while, otrzymamy to.

//while_example2

#include <stdio.h>

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

    return 0;
}

Poniższy rysunek wyjaśnia wykonanie pętli while; w tym przykładzie pętla while sprawdza warunek zapętlenia pięć razy.

Output

While loop: 
1
2
3
4

Chociaż dane wyjściowe dla powyższych pętli while i do-while są identyczne, istnieją pewne subtelne różnice.

W pętli while najpierw sprawdzany jest warunek, a następnie treść pętli. Jeśli więc chcesz, aby pętla wykonała K razy, powinno być dokładnie K uruchomień, w których warunek zapętlenia ma wartość True. W iteracji o numerze K+1 warunek staje się fałszem, a sterowanie wyrywa się z pętli.

Z drugiej strony, jeśli używasz pętli do-while: warunek zapętlenia jest sprawdzany K-ty raz dopiero po przejściu K przez pętlę.

Dlaczego więc ta marginalna poprawa jest pomocna?🤔

Załóżmy, że warunek pętli jest kosztowny obliczeniowo: na przykład wymaga wywołania funkcji rekurencyjnej, złożonej operacji matematycznej i tak dalej.

W takich przypadkach, dla powtórzeń K treści pętli, korzystne byłoby zamiast tego użycie pętli do-while.

Podsumowanie w czasie kontra Do-While

Wymieńmy najważniejsze różnice, których się nauczyliśmy. 👩‍🏫

While LoopDo-While LoopCheck dla warunku zapętlenia: Przed wykonaniem treści pętliSprawdź warunek zapętlenia: Po wykonaniu treści pętli Jeśli warunek jest początkowo False, treść pętli nie jest wykonywana. jest wykonywany dokładnie raz. Warunek zapętlenia jest sprawdzany K razy dla K przechodzi przez pętlę. Warunek zapętlania jest sprawdzany K-1 razy dla K przechodzi przez pętlę. Kiedy używać while loop?
– Pętla powinna działać tak długo, jak warunek jest prawdziwy
– Do pętli z kontrolowanym wejściem
– Kiedy warunek zapętlenia nie jest kosztowny obliczeniowo Kiedy używać pętli do-while?
– Pętla powinna zostać uruchomiona co najmniej raz w przypadku początkowo fałszywego zapętlenia
– Do pętli z kontrolowanym wyjściem
– Gdy warunek zapętlenia jest kosztowny obliczeniowo

Emulacja zachowania pętli Do-While w Pythonie

Z poprzedniej sekcji mamy następujące dwa warunki do emulacji pętli do while:

  • Instrukcje w ciele pętli powinny zostać wykonane co najmniej raz — niezależnie od tego, czy warunek pętli ma wartość True, czy False.
  • Warunek należy sprawdzić po wykonaniu instrukcji w ciele pętli. Jeśli warunek ma wartość False, kontrolka powinna wyrwać się z pętli: wyjść z kontroli.

Instrukcja Infinite While Loop i Break w Pythonie

Możesz zdefiniować nieskończoną pętlę while w Pythonie, jak pokazano poniżej.

while True:
    pass

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

while always-True-condition:
   pass

Instrukcja break może służyć do wyrwania się z treści pętli i przeniesienia kontroli do pierwszej instrukcji poza treścią pętli.

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

W pierwszym przykładzie pętli do-while w C, warunkiem kontynuowania pętli jest liczba < 0. Tak więc warunkiem wyjścia z pętli jest wartość licznika równa zero lub większa od zera (liczba >= 0).

Oto emulacja pętli do while w Pythonie:

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

Przykłady pętli Do-While w Pythonie

Wrócimy do przykładów z poprzedniej sekcji i przepiszemy je w Pythonie, emulując pętlę do while.

#1. Wróćmy do przykładu: wypisanie wartości zmiennej count, gdy liczba jest mniejsza niż pięć.

Wiemy, jak zdefiniować nieskończoną pętlę, aby ciało pętli wykonało się przynajmniej raz.

Pętla powinna trwać tak długo, jak liczba jest mniejsza niż pięć. Dlatego, gdy liczba osiągnie pięć, powinniśmy wyrwać się z pętli. Zatem liczba == 5 jest warunkiem kontroli wyjścia.

Łącząc to, mamy:

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. Możemy również przepisać grę polegającą na zgadywaniu liczb jako konstrukt typu „do-while” w Pythonie.

W grze w zgadywanie liczb sprawdzamy domysły użytkownika na podstawie wstępnie zdefiniowanej tajnej liczby. Użytkownik powinien odgadnąć tajną liczbę w ramach określonej liczby dozwolonych prób, powiedzmy max_guesses.

Kod powinien monitować użytkownika o wprowadzenie danych, niezależnie od tego, czy jego przypuszczenie jest prawidłowe, czy błędne. Możemy to zrobić za pomocą nieskończonej pętli while.

Więc kiedy powinniśmy wyrwać się z pętli?

Kontrolka powinna wyrwać się z pętli, gdy wystąpi jedna z następujących sytuacji:

  • Gdy użytkownik odgadł numer
  • Gdy użytkownik nie odgadł jeszcze liczby, ale wyczerpał dostępną liczbę domysłów. Liczba błędnych odgadnięć przez użytkownika = max_guesses.
  • Poniższa komórka kodu pokazuje, jak możemy to zrobić.

    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

    Zamiast wyłamywać się z pętli, możemy dodać objaśniające instrukcje print(), gdy napotkamy każdy z powyższych warunków, a następnie wyrwać się z pętli.

    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

    Poniżej przedstawiono dwa przykładowe wyjścia.

    W tych przykładowych danych wyjściowych instrukcja break wychodzi z pętli, gdy użytkownik poprawnie odgadnie tajną liczbę.

    # 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!
    

    Oto kolejny przykładowy wynik, gdy użytkownik osiągnie maksymalną dostępną liczbę odgadnięć, ale nie uda mu się poprawnie odgadnąć tajnej liczby.

    # 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!

    Wniosek

    Mam nadzieję, że ten samouczek pomógł ci zrozumieć, jak emulować pętlę do-while w Pythonie.

    Oto najważniejsze wnioski:

    • Użyj nieskończonej pętli, aby upewnić się, że treść pętli zostanie uruchomiona co najmniej raz. Może to być trywialna nieskończona pętla, taka jak while True, lub może to być while , tak że warunek jest zawsze True.
    • Sprawdź warunek wyjścia wewnątrz pętli i użyj instrukcji break, aby wyrwać się z pętli pod określonym warunkiem.

    Następnie dowiedz się, jak używać pętli for i funkcji enumerate() w Pythonie.