While/Else

Slično kao i kod if naredbe i while ima opcionu else granu, koja se izvršava onda kada je uslovu prosleđena vrednost False. Dakle, while petlja se izvršava više puta dok sve dok je uslov True, a else grana se izvršava samo jednom onda kada uslov postane False.

Međutim ukoliko unutar tela petlje dođe do izvršavanja break komande, else grana će biti zaobiđena. Pojednostavimo kôd primera 3 dodavši mu else granu.

  
broj_ocena = int(input("Unesite broj ocena"))
niz = []
x=1
while x<=broj_ocena: 
    ocena= int(input("Unesite ocenu: "))
    
    x=x+1

    if ocena<1 or ocena>5:
        print ("Dozvoljeno je unositi samo ocene od 1 do 5, prekid petlje")
        break
    
    niz.append(ocena)
    
else: #Ovaj deo koda se  izvršava samo ako su uneti svi elementi niza
    print ("unete su ocene: "+str(niz))
            
Kopiraj

Umesto da sami direktno proveravamo da li je lista niz pravilno popunjena, else grana to radi za nas!

Uradimo sada jedan primer while petlje čiji prekid zavisi od slučajno izabranog elementa rečnika boja.

  
import random
boje = {0:"crvena",1:"zelena",2:"plava",3:"zuta",4:"roze",5:"ljubicasta",
6:"braon",7:"crna",8:"bela",9:"teget",10:"bez",11:"bordo",12:"ciklama"}

t_boja=input("Unesite boju koju trazite ")

kljuc=random.randint(0,12);
br_iter=0;
while boje[kljuc]!=t_boja:
    print ("U iteraciji %d nasli smo %s a ne %s"%(br_iter, boje[kljuc], t_boja))
    kljuc=random.randint(0,12);
    br_iter+=1
else: print ("Nadjena je "+t_boja+" posle "+str(br_iter)+" iteracija")
            
Kopiraj

Šta se dešava ako korisnik unese neku boju koje nema u našem rečniku? Tada uslov nikada neće biti False i imaćemo beskonačnu petlju. Stoga je bitno da napravimo mehanizam koji će pre ulaska u petlju proveravati ispravnost ulaza. Ovo može da se uradi preko dodatne funkcije proveri() čiji kod se nalazi na narednoj stranici


Funkcija provere

  
def proveri(boje,trazena_boja):
    kljuc = 0
    while kljuc < len(boje):
        
        #Proveravamo da li je trenutna vrednost ključa tražena boja
        #i ukoliko jeste ne moramo dalje da tražimo. 
        if boje[kljuc]==trazena_boja:
            return True
        kljuc+=1
    else: return False
            

Pozivanjem return naredbe unutar petlje zanemaruje se ostatak tela funkcije a samim tim i petlje, slično kao što break naredba zanemaruje ostatak tela petlje.

Mana ove funkcije je što radi samo za rečnike ovog konkretnog tipa, kome su ključevi prirodni brojevi u određenom opsegu. U sledećem odeljku ćemo videti da je za ovakve petlje, sa fiksnim brojem iteracija, pogodnija for petlja.

Zadatak : Prekopirati kodove iz poslednja dva primera u jedan program i modifikovati ih tako da se provera unosa zaista izvršava. Dodati i dodatnu else granu koja obaveštava korisnika da je neispravan unos i ispisuje mu moguće vrednosti boja. Za pomoć pogledati dodatak.

Zadatak : Napraviti program koji generiše „skriveni“ slučajan broj od 1 do 50 i od korisnika zahteva da pokuša da pogodi koji je broj u pitanju. Posle svakog neuspelog pokušaja, korisnik dobija informaciju da li je skriveni broj veći ili manji od probanog. Petlja se prekida ako je korisnik pogodio broj ili ako je pokušao više od 5 puta.

While petlja je izuzetno korisna kod onih delova programa kod kojih se čeka na neku promenu, na primer na unos korisnika kao u predhodnom zadatku.

Za kraj odeljka o while petlji možete pogledati i sledeći dijagram.


Dijagram for petlje