09/25/2022

Cum să emulați buclele Do-While în Python

În acest tutorial, veți învăța cum să emulați o buclă do-while în Python.

În orice limbaj de programare, buclele vă ajută să efectuați anumite acțiuni în mod repetat, în funcție de o condiție de buclă. Python acceptă bucla while și for, dar nu acceptă în mod nativ bucla do-while.

Cu toate acestea, puteți emula o buclă do-while înțelegând cum funcționează — folosind buclele existente și instrucțiunile de control al buclei în Python.

Veți învăța cum să faceți acest lucru în următoarele minute. Sa incepem!

Ce este constructul Do-While Loop?

Dacă ați programat în limbaje precum C sau C++, probabil că ați fi întâlnit construcția buclei do-while.

Într-o buclă do-while, setul de instrucțiuni din corpul buclei — în cadrul blocului delimitat de acolade — sunt executate mai întâi și apoi este verificată condiția de buclă.

Puteți rula următoarele exemple C în compilatorul online C al tipstrick.ro – chiar din browser.

Luați în considerare următorul fragment de cod:

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

Iată rezultatul.

Output

Do-While loop: 
Loop runs...

În exemplul de mai sus:

  • Valoarea count este 1, iar condiția de buclă este count < 0. Cu toate acestea, bucla rulează o dată chiar dacă condiția de buclă este inițial Fals.
  • Acest lucru este în contrast cu o buclă while care se execută numai dacă condiția de buclă este adevărată în primul rând.
//while_example1

#include <stdio.h>

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

    return 0;
}

După cum sa menționat, condiția de buclă, count < 0 este False inițial variabila count este inițializată la 1. Deci, la compilarea și rularea codului de mai sus, vedem că instrucțiunea din corpul buclei while nu este executată.

Output

While loop: 
//loop body does not run!

While vs. Do-While: O privire de ansamblu asupra diferențelor

Să aruncăm o privire mai atentă la diferențele dintre buclele while și do-while.

Luați în considerare acest exemplu:

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

În celula de cod de mai sus:

  • Variabila de numărare este inițializată la 1.
  • Folosim o buclă do-while.
  • Variabila de numărare este incrementată cu 1 în timpul fiecărei treceri prin buclă, iar condiția de contorizare este setată la numărare < 5.
  Mac Pro este prea scump în comparație cu un PC?

Iată o explicație vizuală a modului în care are loc execuția: cum funcționează bucla do-while și verifică starea de buclă de patru ori.

Output

Do-while loop: 
1
2
3
4

Dacă folosiți o buclă while, aceasta este ceea ce am avea.

//while_example2

#include <stdio.h>

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

    return 0;
}

Figura de mai jos explică execuția buclei while; în acest exemplu, bucla while verifică condiția de buclă de cinci ori.

Output

While loop: 
1
2
3
4

Deși ieșirile pentru buclele while și do-while de mai sus sunt identice, există câteva diferențe subtile.

Într-o buclă while, verificarea stării este mai întâi, urmată de corpul buclei. Deci, dacă doriți ca bucla să ruleze de K ori, ar trebui să existe exact K rulări în care condiția de buclă este adevărată. În iterația numărul K+1, condiția devine Falsă, iar controlul iese din buclă.

Pe de altă parte, dacă utilizați o buclă do-while: condiția de buclă este verificată pentru a K-a oară numai după ce K trece prin buclă.

Deci, de ce este utilă această îmbunătățire marginală?🤔

Să presupunem că condiția de buclă este costisitoare din punct de vedere computațional: de exemplu, implică un apel la o funcție recursivă, o operație matematică complexă și așa mai departe.

În astfel de cazuri, pentru K repetiții ale corpului buclei, ar fi benefic să folosiți în schimb o buclă do-while.

În timp ce vs. Rezumatul Do-While

Să înregistrăm diferențele cheie pe care le-am învățat. 👩‍🏫

While LoopDo-While LoopCheck pentru condiția de buclă: Înainte de execuția corpului buclei Verificarea pentru condiția de buclă: După execuția corpului de buclă Dacă condiția este False inițial, corpul buclei nu este executat. Dacă condiția este False inițial, corpul buclei este executată exact o dată. Condiția de buclă este verificată de K ori pentru K trece prin buclă. Condiția de buclă este verificată de K-1 ori pentru K trece prin buclă. Când să utilizați bucla while?
– Bucla ar trebui să ruleze atâta timp cât condiția este adevărată
– Pentru bucle controlate de intrare
– Când condiția de buclă nu este costisitoare din punct de vedere computațional. Când să folosiți o buclă do-while?
– Bucla ar trebui să ruleze cel puțin o dată pentru o condiție inițială de buclă False
– Pentru bucle controlate de ieșire
– Când condiția de buclă este costisitoare din punct de vedere al calculului

  Cum să utilizați serviciul Livepatch de la Canonical pe Ubuntu

Emularea comportamentului în buclă Do-While în Python

Din secțiunea anterioară, avem următoarele două condiții pentru a emula bucla do-while:

  • Instrucțiunile din corpul buclei ar trebui să fie executate cel puțin o dată, indiferent dacă condiția de buclă este adevărată sau falsă.
  • Condiția trebuie verificată după executarea instrucțiunilor în corpul buclei. Dacă condiția este falsă, controlul ar trebui să iasă din buclă: controlul de ieșire.

Infinite While Loop and Break Statement în Python

Puteți defini o buclă while infinită în Python, așa cum se arată mai jos.

while True:
    pass

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

while always-True-condition:
   pass

Instrucțiunea break poate fi folosită pentru a ieși dintr-un corp de buclă și pentru a transfera controlul la prima instrucțiune din afara corpului buclei.

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

În primul exemplu de buclă do-while din C, condiția de a continua bucla este count < 0. Deci condiția de a ieși din buclă este o valoare de numărare de zero sau mai mare decât zero, (număr >= 0).

Iată emularea buclei do-while în Python:

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

Exemple de bucle Python Do-While

Vom revizui exemplele din secțiunea anterioară și le vom rescrie în Python, emulând bucla do while.

#1. Să revedem exemplul: imprimarea valorilor variabilei de numărare când numărul este mai mic de cinci.

Știm cum să definim o buclă infinită, astfel încât corpul buclei să se execute cel puțin o dată.

Ciclul ar trebui să continue atâta timp cât numărul este mai mic de cinci. Prin urmare, când numărul ajunge la cinci, ar trebui să ieșim din buclă. Deci count == 5 este condiția de control de ieșire.

Punând-o împreună, avem:

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. De asemenea, putem rescrie jocul de ghicire a numărului ca un construct Python do-while.

În jocul de ghicire a numărului, validăm presupunerile unui utilizator în raport cu un număr secret predefinit. Utilizatorul ar trebui să ghicească numărul secret într-un anumit număr de încercări maxime permise, de exemplu, max_guesses.

Codul ar trebui să solicite utilizatorului introducerea, indiferent dacă presupunerea lor este corectă sau greșită. Putem face acest lucru folosind o buclă while infinită.

  Ce sunt unitățile NVMe și ar trebui să cumpărați unul?

Deci, când ar trebui să ieșim din buclă?

Controlul ar trebui să iasă din buclă atunci când are loc oricare dintre următoarele:

  • Când utilizatorul a ghicit numărul
  • Când utilizatorul nu a ghicit încă numărul, dar a epuizat numărul de ghiciri disponibile. Numărul de presupuneri incorecte ale utilizatorului = max_guesses.
  • Celula de cod de mai jos arată cum putem face acest lucru.

    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

    În loc să ieșim din buclă, putem adăuga instrucțiuni explicative print() atunci când întâlnim fiecare dintre condițiile de mai sus și apoi ieșim din buclă.

    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

    Două exemple de rezultate sunt prezentate mai jos.

    În acest exemplu de ieșire, instrucțiunea break iese din buclă atunci când utilizatorul ghicește corect numărul secret.

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

    Iată un alt exemplu de ieșire atunci când utilizatorul atinge numărul maxim de ipoteze disponibile, dar nu reușește să ghicească corect numărul secret.

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

    Concluzie

    Sper că acest tutorial v-a ajutat să înțelegeți cum să emulați o buclă do-while în Python.

    Iată principalele concluzii:

    • Utilizați o buclă infinită pentru a vă asigura că corpul buclei rulează cel puțin o dată. Ar putea fi o buclă infinită trivială, cum ar fi while True, sau poate fi while , astfel încât condiția să fie întotdeauna adevărată.
    • Verificați condiția de ieșire din interiorul buclei și utilizați instrucțiunea break pentru a ieși din buclă într-o anumită condiție.

    Apoi, aflați cum să utilizați buclele for și funcția enumerate() în Python.

    x