Komanda while - ★★ Fog Developer ★★

Novo

6/recent/ticker-posts

Komanda while

8.2 Komanda while 

Komanda while služi za ponavljanje izvršavanja bloka komandi, dokle god je uslov zbog koga se while naredba i poziva, je True (tačan). while je jedna od komandi za petlje (looping statement). Komanda while može da ima i opcionalan else blok, koji će se izvršiti ukoliko uslov za ulazak u while petlju nije ispunjen, ili, ukoliko uslov unutar petlje postane False, nakon izvršavanja te petlje.
Problem: Ništa te ne razumem.
Rešenje: Shvatam šta je tvoj problem, hajde prvo da objasnimo najosnovniji izgled while petlje:
uslov = True
while uslov:
    neki_rad
    uslov = False
else:
    neki_rad
Očigledno smo pre petlje morali da postavimo neki uslov, koji može biti bilo kakav logički izraz, sa rezultatom True ili False. Zatim Python nailazi na naredbu while, praćenu uslovom za ulazak u nju (ako je uslov True, ulazi u petlju, False – nastavlja dalje normalno, a ako postoji else-blok – izvršava ga). Posle uslova moramo staviti dvotačku, jer tako, kao što smo i ranije videli, govorimo Pythonu da sledi novi blok naredbi, sa adekvatnim nivoom uvlačenja. Ako Python izvršava while blok naredbi, on radi neki rad, koji smo mu zadali, a zatim, kada stigne do kraja while bloka, vraća se skroz na while naredbu, zatim opet proverava uslov – ako je uslov još uvek True, on opet izvršava taj blok, i tako, dokle god uslov ne postane False!
Možeš zamisliti životnu situaciju u kojoj ti je dosadno. Obično, kada ti je dosadno, ako si gladan, klopaš, a ako nisi, gledaš TV! Hajde to da „prikažemo“ u interaktivnom promptu.
>>> dosada = True 
>>> sit = 0 
>>> while dosada and (sit < 5): 
...     # jedemo 
...     sit += 1 
...     print('Njam, Njam, pojeo sam', sit, 'palačinaka!') 
... else: 
...     print('Odoh da gledam TV!') 
... 
Njam, Njam, pojeo sam 1 palačinaka! 
Njam, Njam, pojeo sam 2 palačinaka! 
Njam, Njam, pojeo sam 3 palačinaka! 
Njam, Njam, pojeo sam 4 palačinaka! 
Njam, Njam, pojeo sam 5 palačinaka! 
Odoh da gledam TV! 
>>> 
Uslov za petlju nam je bio taj da smo gladni (sitost nam je bila 0) i da nam je dosadno. Seli smo, jeli, više nismo gladni, ali nam je još uvek dosadno, pa smo otišli da gledamo TV. Ali ovako napisan program ima nedostatak. Možda nam više nije dosadno, zašto bi smo gledali TV?
>>> dosada = True 
>>> sit = 0 
>>> while dosada and (sit < 5): 
...     sit += 1 
...     print('Njam, Njam, pojeo sam', sit, 'palačinaka!') 
...     if (sit % 2) == 0: 
...             print('Ispade mi zub!') 
...             dosada = False 
... else: 
...     print('Odoh da gledam TV!') 
... 
Njam, Njam, pojeo sam 1 palačinaka! 
Njam, Njam, pojeo sam 2 palačinaka! 
Ispade mi zub! 
Odoh da gledam TV! 
>>> 
Budući da kada slomimo zub više nema šanse da nam bude dosadno, zašto ne trčati kod zubara, već sedaš ispred TV-a? Ovo jednostavno znači da nismo dobro osmislili uslov petlje, ili da nam ne treba else blok. Odgovor je – u programu je sve u najboljem redu, nama samo treba nešto što ćemo malo kasnije naučiti, ovde sam ti napomenuo samo radi razmišljanja o else bloku, za koji ti dajem još jedan primerčić:
>>> x = 0 
>>> while x < 5: 
...     x += 1 
...     print(x) 
... else: 
...     x += 2 
...     print(x) 
... 
1 
2 
3 
4 
5 
7 
Evo domaćeg za tebe, kako za ove primere, tako i u buduće. Verovatno su te roditelji i učitelji u školi učili da ne treba da, dok nešto čitaš, „vučeš“ prst ispod reči koje trenutno čitaš, i verovatno su ti rekli kako je to nekulturno ili šta ti ja znam. Ja ti na ovom mestu kažem upravo suprotno: kada napišeš program, kreni prstom odozgo nadole, kada naiđeš na komandu if, while, elif, else i neke druge, proveri u svojoj glavi uslov, zatim prst vuci u smeru u kom bi i Python išao, i tako da pokušaš vizuelno da pratiš tok izvršavanja svog programa. Veruj mi, pomoći će ti više nego lupanje glave „nasuvo“ (Zna se da je na primer, jedan od največih naučnika svih vremena Nikola Tesla, čak i u toku šetnje po parku, kada mu se javi neka ideja, umeo da zastane, i štapom po zemlji da „crta“ tj vizuelizuje tok te ideje, pa ne verujem da je njemu iko zamerio za takav način rada). 
Problem: Ja bih da se igram malo... Eksplodiraće mi glava....
Odgovor: Može igra pogađanja broja?
Opet??? Ajde... Nema veze....
Dobro, hajde da napravimo skicu kako će to da izgleda.
U našem programu želimo da se igramo igre pogađanja broja, jednostavno nam je zadat neki broj koji ne znamo i mi pogađamo taj broj sve dok ga ne pogodimo, a da pri tom ne moramo da stalno pokrećemo program, već program pamti naša pogađanja i daje nam adekvatne poruke. Ovaj primer je najbolja demonstracija korišćenje while naredbe. 
Prvo da razmislimo kako otprilike izgleda pogađanje:
pogađanje
if pogađanje == tačan_broj:
    pobeda
elif pogađanje < tačan_broj:
    poruka
else:
    poruka
Aha... Sad treba samo da pomerimo input i if komande unutar while petlje. Treba nam i neka promenljiva vrednosti True pre while petlje. Bilo bi lepo da pre while bloka podesimo i promenljivu koja će „držati“ našu poruku. Izlaz iz while petlje treba da bude u trenutku kada je broj pogođen (znači, u našem slučaju unutar if bloka). 
Opcioni else blok za while naredbu  nam u ovoj prostoj igrici nije ni potreban!
Hajde da krenemo sa „programiranjem“. Sačuvaj kao pogadjanje_broja.py
#!/usr/bin/env python3 

#################################### 
# Jednostavna igra pogađanja broja # 
#################################### 

broj = 42 
poruka = '' 
igra = True 
pokusaj = 0 

print('Dobrodošao u jednostavnu igru.\nEvo ja sam zamislio broj, ti ga pogodi!') 
while igra: 
    pogodak = int(input('Pokušaj da pogodiš: ')) 
    pokusaj += 1 
  
    if pogodak == broj: 
        print('Čestitamo, to je to!') 
        print('Pogodio si iz', pokusaj, 'pokušaja.') 
        igra = False  # Ovo ce prekinuti while petlju 
    elif pogodak < broj: 
        poruka += '\n' + str(pogodak) + ' je manji od traženog.' 
        print(poruka) 
    else: 
        poruka += '\n' + str(pogodak) + ' je veći od traženog.' 
        print(poruka) 

print('Ovo je kraj igrice.') 
input('(ali uvek možeš da je igraš ponovo!)')
Obrati pažnju na način na koji konstruišem poruke koje želim da budu prikazane na ekranu. Pre while-a poruka je bila samo prazan string, a u toku izvršavanja programa, ona postaje sve veća i veća, kako bi korisnik znao šta je već pogađao. Takođe sam i vršio „praćenje“ korisnika sa promenljivom pokušaj, kako bi mu na kraju (kada pogodi) dao do znanja koliko je pokušaja „ispucao“ tokom pogađanja.
Kada pokrenemo program:
./pogadjanje_broja.py 
Dobrodošao u jednostavnu igru. 
Evo ja sam zamislio broj, ti ga pogodi! 
Pokušaj da pogodiš: 24 

24 je manji od traženog. 
Pokušaj da pogodiš: 99 
 
24 je manji od traženog. 
99 je veći od traženog. 
Pokušaj da pogodiš: 50 

24 je manji od traženog. 
99 je veći od traženog. 
50 je veći od traženog. 
Pokušaj da pogodiš: 45 

24 je manji od traženog. 
99 je veći od traženog. 
50 je veći od traženog. 
45 je veći od traženog. 
Pokušaj da pogodiš: 42 
Čestitamo, to je to! 
Pogodio si iz 5 pokušaja. 
Ovo je kraj igrice. 
(ali uvek možeš da je igraš ponovo!) 
Program je glup! Kada jednom znam koji je broj u pitanju, nema svrhe više igrati!
Hm. Razumem tvoje nezadovoljstvo... Za sada nemaš dovoljno znanja, ali zato što si dobar pokazaću ti trik, koji će ti kasnije biti jasan.
Na početku skripte (posle komentara koji govore da je to jednostavna igra, bla, bla... ubaci:
import random
A umesto broj = 42 stavi:
broj = random.randint(0, 1000)
što će uvek kreirati slučajan broj između 0 i 1000 koji treba da pogodiš! Uvek će igra biti jedinstvena!
...
500 je manji od traženog. 
750 je veći od traženog. 
675 je veći od traženog. 
600 je veći od traženog. 
550 je manji od traženog. 
575 je manji od traženog. 
590 je veći od traženog. 
580 je manji od traženog. 
Pokušaj da pogodiš: 585 
Čestitamo, to je to! 
Pogodio si iz 9 pokušaja. 
Ovo je kraj igrice. 
(ali uvek možeš da je igraš ponovo!) 
...
500 je veći od traženog. 
250 je veći od traženog. 
125 je veći od traženog. 
75 je manji od traženog. 
90 je manji od traženog. 
115 je manji od traženog. 
120 je veći od traženog. 
Pokušaj da pogodiš: 117 
Čestitamo, to je to! 
Pogodio si iz 8 pokušaja. 
Ovo je kraj igrice. 
(ali uvek možeš da je igraš ponovo!) 
(veći deo izlaza sam „preskočio“ da uštedim prostora u tutorijalu)

8.1 if komanda Indeks 8.3 for petlja

Постави коментар

0 Коментари