În acest ghid, vei descoperi cum să simulezi o structură de control do-while în Python.
În programare, buclele permit executarea repetată a unui bloc de cod, în funcție de o anumită condiție. Python oferă buclele while și for, dar nu include în mod direct bucla do-while.
Totuși, poți imita comportamentul unei bucle do-while înțelegând mecanismul său de bază, utilizând buclele existente și instrucțiunile de control al fluxului din Python.
În următoarele minute, vei învăța cum să faci acest lucru. Să începem!
Ce este structura buclei Do-While?
Dacă ai lucrat cu limbaje precum C sau C++, probabil că ai întâlnit structura buclei do-while.
Într-o buclă do-while, instrucțiunile din interiorul buclei – în blocul delimitat de acolade – sunt executate inițial, iar apoi este evaluată condiția de continuare a buclei.
Poți testa următoarele exemple C direct în browser, folosind compilatorul online C de la tipstrick.ro.
Analizează 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 anterior:
- Variabila
count
este inițializată cu 1, iar condiția buclei estecount < 0
. Cu toate acestea, bucla rulează o dată, chiar dacă inițial condiția este falsă. - Acest lucru contrastează cu o buclă while, care se execută doar dacă condiția buclei este adevărată de la început.
//while_example1 #include <stdio.h> int main() { int count = 1; printf("While loop: n"); while(count<0){ printf("Loop runs..."); } return 0; }
După cum am menționat, condiția buclei count < 0
este falsă inițial, variabila count
fiind setată la 1. Deci, la compilarea și rularea codului de mai sus, observăm că instrucțiunea din corpul buclei while nu este executată.
Output While loop: //loop body does not run!
While vs. Do-While: O analiză comparativă a diferențelor
Să analizăm mai atent deosebirile dintre buclele while și do-while.
Să considerăm 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 blocul de cod de mai sus:
- Variabila
count
este inițializată cu 1. - Utilizăm o buclă do-while.
- Variabila
count
este incrementată cu 1 la fiecare iterație, iar condiția buclei estecount < 5
.
Iată o reprezentare vizuală a desfășurării execuției: cum funcționează bucla do-while și verifică starea de continuare a buclei de patru ori.
Output Do-while loop: 1 2 3 4
Dacă am folosi o buclă while, iată ce am obține.
//while_example2 #include <stdio.h> int main() { int count = 1; printf("While loop: n"); while(count<5){ printf("%dn",count); count++; }; return 0; }
Graficul de mai jos ilustrează execuția buclei while; în acest caz, bucla while verifică condiția de continuare de cinci ori.
Output While loop: 1 2 3 4
Deși rezultatele pentru buclele while și do-while de mai sus sunt identice, există câteva diferențe subtile.
Într-o buclă while, verificarea condiției se face inițial, urmată de corpul buclei. Așadar, dacă dorești ca bucla să ruleze de K ori, ar trebui să existe exact K iterații în care condiția este adevărată. La iterația K+1, condiția devine falsă, și controlul iese din buclă.
Pe de altă parte, folosind o buclă do-while: condiția buclei este evaluată pentru a K-a oară abia după ce au avut loc K execuții ale corpului buclei.
Deci, de ce este utilă această mică îmbunătățire?🤔
Să presupunem că evaluarea condiției buclei este costisitoare din punct de vedere computațional: de exemplu, implică apelul unei funcții recursive, o operație matematică complexă etc.
În astfel de cazuri, pentru K repetări ale corpului buclei, ar fi mai eficient să folosești o buclă do-while.
Rezumat comparativ While vs. Do-While
Să recapitulăm principalele diferențe pe care le-am învățat. 👩🏫
Bucle While | Bucle Do-While |
Verificarea condiției buclei: Înainte de executarea corpului buclei | Verificarea condiției buclei: După executarea corpului buclei |
Dacă condiția este inițial Falsă, corpul buclei nu este executat. | Dacă condiția este inițial Falsă, corpul buclei este executat exact o dată. |
Condiția buclei este verificată de K ori pentru K iterații. | Condiția buclei este verificată de K-1 ori pentru K iterații. |
Când să folosești o buclă while? – Bucla ar trebui să ruleze cât timp condiția este adevărată – Pentru bucle controlate de intrare – Când condiția buclei nu este costisitoare din punct de vedere computațional. |
Când să folosești o buclă do-while? – Bucla ar trebui să ruleze cel puțin o dată chiar dacă condiția inițială este falsă – Pentru bucle controlate de ieșire – Când condiția buclei este costisitoare din punct de vedere computațional |
Simularea comportamentului buclei Do-While în Python
Din secțiunea anterioară, avem următoarele două condiții pentru a imita o buclă do-while:
- Instrucțiunile din interiorul corpului buclei trebuie să fie executate cel puțin o dată, indiferent dacă condiția buclei este adevărată sau falsă.
- Condiția trebuie verificată după executarea instrucțiunilor din corpul buclei. Dacă condiția este falsă, controlul ar trebui să iasă din buclă: controlul ieșirii.
Bucle While infinite și instrucțiunea Break în Python
Poți defini o buclă while infinită în Python, după cum urmează:
while True: pass # În loc de True, poți avea orice condiție care este întotdeauna True while always-True-condition: pass
Instrucțiunea break
poate fi utilizată pentru a ieși dintr-un corp de buclă și a transfera controlul la prima instrucțiune din afara corpului buclei.
while <condiție>: if <o anumită-condiție>: break
În primul exemplu de buclă do-while din C, condiția de continuare a buclei este count < 0
. Așadar, condiția de ieșire din buclă este ca valoarea lui count
să fie zero sau mai mare (count >= 0
).
Iată cum putem simula o buclă do-while în Python:
count = 1 while True: print("Loop runs...") if(count >= 0): break
Exemple de bucle Python Do-While
Vom analiza exemplele din secțiunea anterioară și le vom rescrie în Python, simulând o buclă do-while.
#1. Să revedem exemplul: afișarea valorilor variabilei count
când aceasta este mai mică de cinci.
Știm cum să creăm o buclă infinită, astfel încât corpul buclei să se execute cel puțin o dată.
Bucla ar trebui să continue cât timp count
este mai mică de cinci. Prin urmare, când count
ajunge la cinci, ar trebui să ieșim din buclă. Astfel, count == 5
este condiția de control al ieșirii.
Punând totul cap la cap, 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. Putem rescrie și jocul de ghicit numărul ca o structură do-while în Python.
În jocul de ghicit numărul, validăm încercările unui utilizator comparându-le cu un număr secret prestabilit. Utilizatorul trebuie să ghicească numărul secret într-un anumit număr maxim de încercări permise, de exemplu, max_guesses
.
Codul ar trebui să ceară utilizatorului introducerea, indiferent dacă presupunerea lor este corectă sau greșită. Putem realiza acest lucru folosind o buclă while infinită.
Deci, când ar trebui să ieșim din buclă?
Controlul ar trebui să iasă din buclă când se întâmplă una dintre următoarele:
- Când utilizatorul a ghicit numărul.
- Când utilizatorul nu a ghicit numărul, dar a epuizat numărul de încercări disponibile. Numărul de presupuneri incorecte ale utilizatorului =
max_guesses
.
Blocul 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 imediat din buclă, putem adăuga instrucțiuni print()
explicative atunci când întâlnim fiecare dintre condițiile de mai sus, iar 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 rezultat, 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 rezultat când utilizatorul atinge numărul maxim de încercări 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 ghid te-a ajutat să înțelegi cum să simulezi o buclă do-while în Python.
Iată principalele concluzii:
- Folosește o buclă infinită pentru a te asigura că instrucțiunile din corp rulează cel puțin o dată. Ar putea fi o buclă infinită simplă, cum ar fi
while True
, sau poate fiwhile <condiție>
, astfel încât condiția să fie întotdeauna adevărată. - Verifică condiția de ieșire din interiorul buclei și utilizează instrucțiunea
break
pentru a ieși din buclă în anumite condiții.
Apoi, explorează cum să utilizezi buclele for
și funcția enumerate()
în Python.