Python za radoznale: Postavljanje uvjeta i donošenje odluka (if, elif, else blokovi)

182 views
Skip to first unread message

Hrvoje Katić

unread,
Dec 17, 2011, 9:52:05 AM12/17/11
to hrprog...@googlegroups.com
Donošenje odluka u Python programskom jeziku (if, elif, else)

Donošenje odluka ovisno o nekoj situaciji je vrlo bitno kako u stvarnom
životu tako i u programiranju. Objasnit ću to s nekoliko jednostavnih
primjera iz realnog života:
1. Ako imam dovoljno novaca, večeras idem van, u suprotnom ostajem kod kuće.
2. Ako van ide i muško i žensko društvo, onda idemo na piće. Ako van ide
samo muško društvo, onda idemo do sportske kladionice, a ukoliko neide
niti muško niti žensko društvo, ostajem kod kuće.
3. Ako van ide Mirko, on plaća piće. Ako van ide Slavko, onda pola plaća
on, a pola Mirko, u suprotnom svatko plaća sam sebi.
Dakle, ovdje donosimo odluke ovisno o tome koji će se uvjeti ispuniti,
odnosno koji se uvjeti neće ispuniti.
U python programskom jeziku, za donošenje odluka ovisno o situaciji
koristimo ključnu riječ if (ako). Sintaksa if naredbe izgleda ovako:
if izraz1 operator usporedbe izraz2:
# blok koda koji će se izvršiti ukoliko se uvjet ispuni
Krenimo sada sa primjerom jednostavne if naredbe, koji napišimo u
datoteci primjer5.py.
godina = 2011
starost = 24
if godina == 2011:
print "Sada je jos uvijek 2011. godina."
if starost >= 24:
print "Imate 24 ili vise godina."
raw_input()
Dakle, ovaj program radi sljedeće:
1. Pohranjuje trenutnu godinu (2011) u varijablu godina, kao cjelobrojnu
vrijednost.
2. Pohranjuje trenutnu starost (24) u varijablu starost, kao cjelobrojnu
vrijednost.
3. Prvo ispituje je li trenutna godina 2011, na način da ispituje
sadržaj varijable godina pomoću if naredbe. Ako jest, izvršit će se
linija koda koja ispisuje na ekranu poruku "Sada je jos uvijek 2011.
godina.".
4. Zatim ispituje je li sadržaj varijable starost broj 24 ili više. Ako
jest, izvršava se linija koda koja ispisuje na ekranu poruku "Imate 24
ili vise godina.".
Dakle, kada pokrenemo ovaj program, ispunit će se oba uvjeta, te će se
stoga izvršiti oba bloka koda unutar obje if naredbe. Stoga ćemo na
ekranu pokretanjem ovog programa vidjeti sljedeće:
Sada je jos uvijek 2011. godina.
Imate 24 ili vise godina.
No, što će se dogoditi ako recimo izmijenimo program tako da varijabli
godina promijenimo vrijednost iz 2011 u 2012? Jednostavno, U prvoj if
naredbi uvjet se neće ispuniti, te se stoga blok naredbi unutar iste
neće izvršiti, što znači da će se pokretanjem programa izvršiti samo
blok naredbi unutar druge if naredbe tj. na ekranu će se ispisati samo
druga poruka.
Međutim, ako i varijabli starost promijenimo vrijednost u broj manji od
24, recimo u 20, onda se niti jedan blok naredbi unutar obje if naredbe
neće izvršiti, budući da uvjeti nisu bili ispunjeni u nijednoj if
naredbi, te ćemo pokretanjem programa dobiti prazan ekran. U ovakvim
slućajevima, poželjno je donijeti odluku što će se dogoditi (koji blok
naredbi će se izvršiti) ukoliko se nijedan uvjet ne ispuni, što nam
omogućuje else (inaće) ključna riječ. Izmijenimo prethodni primjer tako
da uključimo i else naredbu.
godina = 2011
starost = 24
if godina == 2011:
print "Sada je jos uvijek 2011. godina."
else:
print "2011. godina je iza nas."
if starost >= 24:
print "Imate 24 ili vise godina."
else:
print "Imate manje od 24 godine."
raw_input()
Ovdje smo, dakle, svakoj if naredbi dodali i po jedan else blok naredbi.
Sada, ukoliko objema varijablama promijenimo vrijednosti, umjesto
praznog ekrana dobit ćemo sljedeće poruke:
2011. godina je iza nas.
Imate manje od 24 godine.
Kao što možete i sami zaključiti, uključenje else naredbe nije nužno,
ali je dobro ukoliko želimo da program odradi alternativnu zadaću u
slućaju ako se neki od uvjeta ne ispuni.
No, što ako se nađemo u situaciji da želimo kombinirati više if naredbi,
tj. postaviti sljedeći uvjet ukoliko se prethodni uvjet nije ispunio? U
tom slućaju koristi se elif ključna riječ. Evo primjera, koji ćemo
napisati u datoteci primjer6.py.
ime = raw_input("Unesite vase cijenjeno ime:")
if ime == "Hrvoje":
print "Dobrodošao u program!"
elif ime == "Robert":
print "Vi nemate dovoljno privilegija za koristenje ovog programa,
zbogom!"
else:
print "Niste upisali valjano ime, pristup programu vam nije dozvoljen!"
raw_input()
Dakle da pojasnimo sada sve linije ovog koda:
1. Varijabli ime dodijelili smo raw_input funkciju, koja zahtijeva od
korisnika da unese svoje ime, čeka od korisnika neki unos, te vraća
unesen tekst kao string. To dakle znači da će varijabli ime biti
dodijeljen string koji ste unijeli nakon pokretanja programa i
prikazivanja zahtjeva.
2. Zatim smo pomoću if naredbe ispitali da li je korisnik unio ime
Hrvoje, sa velikim početnim slovom H, bez razmaka i interpunkcije.
3. Ako jeste, program izvršava blok naredbi unutar te if naredbe, tj.
ispisuje poruku dobrodoslice. Ako ne, taj blok naredbi se preskaće i
prelazi se na sljedeci uvjet, postavljen elif naredbom, koja ispituje je
li možda korisnik upisao ime Robert sa velikim početnim slovom R, bez
razmaka i interpunkcije.
4. Ako se taj uvjet ispuni, izvršit će se blok naredbi kojim program
ispisuje na ekranu poruku da korisnik s tim imenom nema privilegije za
koristenje programa.
5. Ako se niti jedan od prethodno postavljenih uvjeta ne ispuni, tj. ako
korisnik ne unese niti jedno ime ili unese ime koje program ne
prepoznaje, program prelazi na blok naredbi unutar else naredbe, te se
na ekranu ispisuje poruka da ime nije uneseno.
Kod kombiniranja if naredbi uporabom elif ključne riječi, blok naredbi
unutar else naredbe se preskače ukoliko se bar jedan od postavljenih
uvjeta ispunio.
Također je moguće ubacivati if naredbe unutar if naredbi, što se zove
grananje. Međutim, pazite da ne pretjerujete s tim, jer to može otežati
čitanje koda i ispravljanje grešaka, te ponekad zbuniti i samog
programera. Slijedi primjer, koji ćemo napisati unutar datoteke primjer7.py.
ime = "Perica"
zadovoljan = True
bogat = False
if ime is "Perica":
if not bogat:
print "On je siromašan."
if zadovoljan:
print "Zadovoljan je."
raw_input()
Dakle da pojasnimo:
1. Stvorili smo tri varijable, od kojih prva (ime) sadrži string
"Perica", dok druga i treća sadrže Boolean operatore (zadovoljan s
vrijednošću True, te bogat s vrijednošću False).
2. Prvo smo pomoću if naredbe ispitali da li varijabla ime sadrži string
"Perica". Ovdje ste mogli primijetiti novu ključnu riječ "is", koja se
može upotrebljavati umjesto operatora usporedbe ==.
3. Ukoliko je uvjet ispunjen, tj. ako je ime "Perica", program će
ispitati je li Perica bogat. S obzirom da nismo htjeli ispitati je li on
bogat, nego suprotno, dakle da li on nije bogat, ubacili smo još jednu
novu ključnu riječ, not.
4. Budući da je varijabli bogat dodijeljen Boolean False, program će
izvršiti blok naredbi koji ispisuje poruku da je on siromašan.
5. Nakon toga, sljedećom if naredbom ispitali smo da li je on
zadovoljan, provjerom stanja varijable zadovoljan. Budući da varijabla
zadovoljan sadrži vrijednost True, izvršit će se blok naredbi koji na
ekranu ispisuje poruku da je on zadovoljan.
Dakle ukratko, program funkcionira tako da ukoliko ime nije Perica, u
tom slućaju se neće izvršiti blok naredbi koji ispituje nije li on bogat
i zadovoljan.
Kao što vidite, ulazimo u situaciju da nam zbog uporabe tolikih if
naredbi, te uporabe if naredbi unutar if naredbi program postaje sve
više zakompliciran. Srećom, postoji rješenje, pomoću kojega unutar jedne
if naredbe možemo postaviti više uvjeta, i to uporabom and operatora
(veznik i). Evo kako to izgleda! Izmijenimo prethodni kod, tako da
koristimo and operator.
ime = "Perica"
zadovoljan = True
bogat = False
if ime is "Perica":
if not bogat and zadovoljan:
print "On je siromašan, ali je ipak zadovoljan."
raw_input()
Dakle što smo ovim dobili? Smanjili smo kod za dvije linije, tako da smo
s jednom, a ne dvije if naredbe kao u prethodnom primjeru, ispitali nije
li on bogat, i je li on zadovoljan. Također, prilagodili smo poruku koja
se ispisuje na ekranu, jer budući da smo istom if naredbom postavili
pitanje nije li on bogat i je li on siromašan, na ekranu se mora
ispisati odgovor na oba pitanja u poruci.
No, može li se to još pojednostaviti, tako da izbacimo primjenu tehniku
grananja? Može! Izmijenimo još jednom ovaj primjer.
ime = "Perica"
zadovoljan = True
bogat = False
if ime is "Perica" and not bogat and zadovoljan:
print "On je siromašan, ali je ipak zadovoljan."
raw_input()
Dakle, ovdje smo uporabom tri and operatora izbjegli potrebu za
grananjem, ali i smanjili kod za još jednu liniju.
No, razmotrimo ovaj slućaj. Što ako želimo da uporabom jedne if nareedbe
provjerimo status osobe koja se zove ili Perica, ili Ivica, ili Marica i
sl. Ovdje u igru ulazi or (ili) operator. Pomoću or operatora, možemo
postaviti više uvjeta unutar jedne if naredbe, a blok naredbi unutar te
if naredbe izvršit će se ukoliko je bar jedan od njenih postavljenih
uvjeta ispunjen. Dakle, program će ispitati nije li ta osoba bogata i je
li zadovoljna u slućaju ako se ona zove Perica, Ivica ili Marica. Evo
kako to treba biti napisano:
if ime is "Perica" or ime is "Ivica" or ime is "Marica" and not bogat
and zadovoljan:
print "Ova osoba je siromasna, ali je ipak zadovoljna."
Preporuka, također nemojte pretjerivati niti s previše uvjeta unutar
iste if naredbe, jer bi vas to moglo zbuniti kada nakon nekog dužeg
vremena pročitate kod i pokušate shvatiti što ste tada htjeli napraviti.

if - in

Korištenjem in ključne riječi unutar if naredbe možemo provjeriti da li
neki niz znakova ili podatkovni niz (o ćemu će riječi biti kasnije)
sadrži neki određeni element. Sintaksa:
if pojam in niz:
# izvrši ovaj blok naredbi
Evo i primjer:
ime = "Perica"
if 'a' in ime:
print "Da, ime sadrzi u sebi slovo a."
elif 'z' not in ime:
print "Ime ne sadrzi slovo z."
Mislim da tu nije potrebno previše objašnjavanja. U prvoj if - in
naredbi ispitali smo da li string "Perica" pohranjen u varijabli ime
sadrži slovo a, te budući da je slovo a zadnje slovo u imenu, program će
ispisati poruku da to slovo postoji u imenu. Nakon toga, ispitujemo da
li možda postoji slovo z u imenu, a budući da ne postoji, program će to
tako i saopćiti.

Napomene

1. Možda ste primijetili da kod ispitivanja varijabli koje sadrže
Boolean operatore nismo pisali ovako:
if zadovoljan == True:
nego ovako:
if zadovoljan:
Također, nismo pisali:
if bogat == False:
nego smo pisali:
if not bogat:
Dakle, prednost kod Boolean vrijednosti, koja vraća False i True odnosno
0 i 1 je ta da ukoliko želimo ispitati je li ona istinita ili lažna,
nije potrebno pisati operatore usporedbe == i !=. Umjesto toga, ako
želimo ispitati jeli Boolean vrijednost istinita ili lažna, umjesto ==
odnosno is, dovoljno je samo napisati True ili False odnosno naziv
varijable koja sadrži Boolean vrijednosti, a ako želimo ići u suprotnom
smijeru tj. ispitati nije li ta vrijednost istinita ili lažna, ne moramo
upotrebljavati operator usporedbe !=, nego je dovoljno napisati ključnu
riječ not te iza toga True, False ili varijablu koja sadrži Boolean
vrijednost.
Sjetimo se sada indentacije tj. uvlačenja redova, o ćemu je bilo riječi
u prijašnjem poglavlju. Primijetili smo da iza svake if naredbe, elif
naredbe, te else naredbi slijedi znak dvotočka (:). To znači da je blok
naredbi koji se izvršava unutar svake if, elif i else naredbe obavezno
uvući za minimalno jedan razmak ili tabulator u desno. Preporučam vam da
prije prelaska na sljedeće poglavlje, još jednom dobro i detaljno
prijeđete sve primjere iz ovog poglavlja, te posebno obratite pažnju na
indentaciju, tj. na linije koda gdje smo je upotrijebili. Ozbiljno to
shvatite, jer indentacija će nam sve više trebati, a kod se neće htjeti
izvršiti ukoliko je nismo dobro upotrijebili.

Reply all
Reply to author
Forward
0 new messages