Ciclo while
In questa pagina 5
Sintassi e semantica
while condizione:
corpoLa condizione viene valutata prima di ogni iterazione; se è falsa all'inizio il corpo non viene mai eseguito. Il corpo deve modificare qualcosa da cui dipende la condizione, altrimenti il ciclo è infinito.
Python non ha do ... while: si ottiene con while True + break (vedi sotto). In C esiste: Tipi, operatori e controllo del flusso in CTipi interi e reali del C con dimensioni e limiti, conversioni implicite e cast, divisione intera, operatori di incremento, logici e bit a bit; if, switch, while, do-while, for, break e continue.Tipi, operatori e controllo del flusso in C →.
Schemi tipici
Controllato da contatore (numero di iterazioni noto; di solito si preferisce for, vedi Ciclo for e rangefor scorre gli elementi di un iterabile; range per gli indici; enumerate, zip, reversed, sorted; cicli annidati; quando usare for e quando while.Ciclo for e range →):
i = 0
while i < 10:
print(i)
i += 1Controllato da condizione (numero di iterazioni non noto a priori):
# numero di cifre di n > 0
cifre = 0
while n > 0:
n //= 10
cifre += 1# algoritmo di Euclide per il MCD
while b != 0:
a, b = b, a % b
# ora a è il MCDSentinella (si legge finché arriva un valore speciale):
somma = 0
x = int(input("numero (0 per finire): "))
while x != 0:
somma += x
x = int(input("numero (0 per finire): "))Validazione dell'input (schema "ripeti finché valido", equivalente a un do-while):
while True:
eta = int(input("età: "))
if eta >= 0:
break
print("valore non valido")break, continue, else
break: esce subito dal ciclo più interno.continue: salta il resto del corpo e torna al controllo della condizione.elsedopo il ciclo: eseguito se il ciclo termina senzabreak(tipico nelle ricerche).
d = 2
while d * d <= n:
if n % d == 0:
print(n, "non è primo")
break
d += 1
else:
print(n, "è primo") # nessun divisore trovato (per n >= 2)Correttezza: terminazione e invariante
- Terminazione: si individua una quantità intera non negativa che diminuisce a ogni iterazione (in Euclide:
b, perchéa % b < b). - Invariante di ciclo: proprietà vera prima e dopo ogni iterazione; alla fine, insieme alla condizione falsa, dà il risultato. Nel ciclo della somma con sentinella: "
sommaè la somma dei valori letti finora, escluso l'ultimo".
Ragionare per invarianti aiuta a scrivere e a correggere i cicli (vedi Pattern algoritmici iterativiSchemi ricorrenti nei cicli: accumulatore, contatore, massimo e minimo, ricerca con uscita anticipata, verifica universale, filtro e trasformazione, finestra scorrevole, due indici, elaborazione di coppie.Pattern algoritmici iterativi →).
Errori tipici
- Dimenticare l'aggiornamento della variabile di controllo (ciclo infinito: si interrompe con Ctrl+C).
- Errore di uno (off-by-one):
<al posto di<=o viceversa. Verificare a mano il primo e l'ultimo giro. - Variabile della condizione non inizializzata prima del ciclo (
NameError).