Lecții din modul (2/4)
bucle while
Bucla while repetă un bloc atâta timp cât o condiție rămâne adevărată. Utilizați
while atunci când nu știți dinainte de câte iterații veți avea nevoie:
numărul de runde depinde de ceva care se schimbă în interiorul buclei.
Sintaxă
n = 1
while n < 1000:
n = n * 2
n # 1024Blocul indentat este executat în mod repetat. Înainte de fiecare iterație Python evaluează condiția: de îndată ce devine falsă, bucla se termină și execuția continuă după bloc.
Modele comune
Contor manual — echivalent cu un for clasic în alte limbi:
i = 0
while i < 5:
print(i)
i = i + 1Buclă infinită + condiție de ieșire internă — utilă atunci când condiția este evaluat după ce a făcut ceva:
acc = 0
while True:
acc = acc + 1
if acc * acc > 100:
break
acc # 11 (11*11 = 121 is the first square > 100)break iese imediat din bucla cea mai interioară (o vom vedea în următorul
lectie).
Greșeala clasică: bucla infinită
Dacă variabila din condiția nu se modifică în interiorul buclei,
programul nu se termină niciodată. Este bug-ul numărul unu cu while:
n = 0
while n < 10:
print(n) # n is never modified → infinite loop!În exercițiile noastre există un timeout de execuție, așa că o buclă infinită va eșua cu un mesaj clar în loc să înghețe browserul. Dar în producție an bucla infinită este o eroare serioasă.
Risc de bucle infinite și condiții de terminare
O buclă while se execută atâta timp cât condiția sa este evaluată la Adevărat. Dacă uitați să actualizați variabilele care afectează condiția, bucla va rula la infinit, înghețând timpul de execuție. Asigurați-vă întotdeauna că corpul buclei progresează către starea de ieșire.
Încercați-l singur
Găsiți cel mai mic număr întreg `n >= 1` astfel încât 2**n să depășească un milion. Atribuiți-l la „rezultat” și evaluați-l (ar trebui să fie 20).
Afișează indiciu
2**20 = 1.048.576 este primul care depășește 1.000.000.
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
Începând de la `n = 1000`, înjumătățiți n cu împărțirea întregului (n // 2) până când devine 0. Numărați câte iterații sunt necesare în `pași`. Evaluați „pașii”.
Afișează indiciu
1000 → 500 → 250 → 125 → 62 → 31 → 15 → 7 → 3 → 1 → 0: zece trepte.
Soluție disponibilă după 3 încercări
Provocare suplimentară
Given the variable `n = 32`, write a `while` loop to count how many times you can divide `n` by 2 (using floor division `//`) before `n` becomes less than or equal to 1. Store the count in `divisions` and evaluate it.
Afișează indiciu
The while condition is n > 1. Inside the loop, divide n by 2 and increment divisions by 1.
Soluție disponibilă după 3 încercări