Komanda if

8.1 Komanda if

Prva komanda koju želim da ti objasnim je if , i ona se koristi da bi se proverio neki uslov: ukoliko je  uslov istinit, Python izvršava neki blok (skup uvučenih) naredbi (i taj blok nazivamo if-blok), u suprotnom Python će izvršiti neki drugi blok naredbi (koji se zove else-blok). else-blok naredbi nije obavezan, ako ga ne navedemo, naš program će nastaviti normalno da radi od mesta na kome se završava if-blok.
Ma čekaj? If? Else? Ako-onda, inače? Jel to prevod? Nije valjda tako jednostavno?
Zapravo: jeste! Ali pre toga moraš obratiti pažnju na sintaksu tj. kako se if naredba koristi u programima:
if bulova_konstanta:
    blok_naredbi
if komandu (ili bolje reći if grananje) smo definisali tako što smo napisali reč if, a zatim smo naveli neku bulovu konstantu (tj True ili False). Posle toga ide dvotačka, koja je veoma važna! Nije ona toliko važna nama, koliko Pythonu, jer mu ona doslovno govori: „posle mene sledi blok naredbi, koji je posebna celina.“. Nije ni čudo što većina editora, u trenutku kada ukucate tu famoznu dvotačku, sledeći red počinje uvučeno!
A to uvučeno je upravo najvažnija stvar za nas! Obrati pažnju! Sledeći red smo počeli da pišemo se nekim „razmakom“ ili „uvlačenjem“ u odnosu na ostatak našeg programa.
Do sada si video da sve što si kucao je moralo tačno da počne na početku linije, u suprotnom ti je Python izbacivao grešku! A šta se dešava sada? Pa, isto to! Samo, na kraju prethodne linije stoji dvotačka, i ona kaže Pythonu - „Od sledeće linije je zaseban blok naredbi, prepoznaćeš ga po tome koliko je uvučen u odnosu na ovu liniju u kojoj si sada...“, što znači za nas – kada uvučemo neki blok naredbi, sve naredbe koje pripadaju tom bloku moraju biti na isti način uvučene! Znači, mi možemo „uvlačiti“ blokove proizvoljan broj polja (spejs ili tab tasteri na tastaturi), ali ako naredbe pripadaju istom bloku, onda isto moraju i da budu uvučene!
Pošto ovo može biti konfuzno, ne samo za tebe, već i za druge programere (ako uzmeš nečiji program, gledajući ga, kako možeš znati jel neko koristio „spejs“ ili „tab“, i koliko je ko koristio tabova, spejsa?), ljudi koji se bave programiranjem u Pythonu su se dogovorili: uvek koristi 4 „spejsa“ za jedan nivo uvlačenja! Ili, ako voliš tab, negde u podešavanju svog tekst editora ga podesi na vrednost od 4 spejsa. Ili... Hehe, možeš da koristiš editor, kao što je IDLE, koji će automatski da uvuče deo posle dvotačke.
No da se vratimo na „temu“... Prema svemu prethodnom, minimalna if naredba bi izgledala ovako: 
>>> if True: 
...     print('Tačno je! Jupi!') 
... 
Tačno je! Jupi! 
>>> 
A da proverimo ovu „foru“ sa uvlačenjem:
>>> if True: 
...     g = input('Unos: ') 
...      print('Iznos:', g) 
  File "<stdin>", line 3 
    print('Iznos:', g) 
    ^ 
IndentationError: unexpected indent 
>>> 
Očekivano, Python je izbacio grešku, ali sada znamo kako je ispraviti:
>>> if True: 
...     g = input('Unos: ') 
...     print('Iznos:', g) 
... 
Unos: 23 
Iznos: 23 
>>> 
Ako pažljivo osmotrimo, zašto bi smo bili ograničeni na bulovu konstantu? Pa na njenom mestu možemo staviti bilo koji matematički ili logički izraz, koji će nam dati vrednost True ili False!
>>> x = 4 
>>> if x <= 4: 
...     print('x je:', x) 
... 
x je: 4 
>>> 
Ovo bi nam bilo sasvim dovoljno da počnemo da kreiramo neke svoje programe, ali, šta ćemo sa else-blokom? Ako želimo da imamo i else-blok, sintaksa bi bila sledeća:
if bulova_konstanta:
    blok_naredbi
else:
    neki_drugi_blok_naredbi
Sve što treba da uradimo je da napišemo reč else, praćenu dvotačkom, a posle novi red u koji ide novi blok naredbi uvučemo isto onoliko koliko smo i uvlačili blok ispod if komande. 
Najlakše je shvatiti kreiranje programa na ovaj način:
if kasno:
    uzmi novčanik
    idi kolima
else:
    spremi doručak
    jedi
    idi pešaka na posao
radi na poslu
Naš junak se probudio, pogledao na sat, ako je kasno, morao je da žuri, ako nije, može nešto i da pojede. Bilo kako bilo, on dolazi na posao i tamo nešto radi. I sada kreće problem: šta ako u rezervoaru nema mnogo benzina?
Uh, pa to zapravo i nije problem! Mi možemo da „ugnjezdimo“ više if naredbi u jednu, ali primer će da ti kaže više od mojih hiljadu reči:
if kasno:
    uzmi novčanik
    idi kolima
    if not benzin:
        skokni do pumpe i natoči
        vozi malo brže
    else:
        produži normalno
else:
    if hrana u frizideru:
        spremi doručak
        jedi
    else:
        uzmi novčanik
    idi pešaka na posao
radi na poslu
Ovo već liči na neki realniji scenario, zar ne?
U primeru vidimo da smo, kada smo naleteli na još jednu nedoumicu, uradili isto što i do sada: samo primenili nova, dublja, uvlačenja!
No, hajde da te ne davim više sa „jutarnjom gimnastikom“, već hajde da ti postavim jednostavno pitanje. Sada znaš da „ugnjezdiš“ jednu if komandu u drugu, i da primeniš adekvatan nivo uvlačenja za „ugnježdene“ blokove, ali, koliko bi nam nivoa trebalo za sledeći problem: Učenici rade neki test na kome je maksimalan broj bodova 100, program treba da nam da tekstualni opis rezultata za svakog učenika, i to ako je osvojio 95-100 bodova – fantastično, 90-95 – izuzetno, 85 – 90 – odlično, 80 – 85 – malo fali do odlično, 75 – 80 – vrlo dobro, itd...
Prethodnom logikom bi nam trebalo 20 nivoa uvlačenja! Bezveze, zar ne? Kada bi otvorili takav program u svom editoru, brzo bi se izgubili.... Ne brini se... Python ima rešenje i za ovakve situacije! Naredba if, sem opcionog else-bloka, može da ima i neograničen broj elif blokova (naziv im je nastao jednostavnim spajanjem reči else i if – elif). Evo primer, pa prosudite:
if rezultati >= 95:
    print('Fantastično!')
elif rezultati >= 90:
    print('Izuzetno!')
elif rezultati >= 85:
    print('Odlično!')
elif rezultati >= 80:
    print('Vrlo dobro!')
else:
    print('Mrzi me da proveravam!')
Sada je naš program lakše čitljiv, zar ne?
Ali, šta je sad ovo? Zar program neće za rezultat od 70 poena napisati i Fantastično, i Odlično itd?
Pravo pitanje na pravom mestu!
Da, mogao sam u svakom elif bloku uslov za proveru definisati kao npr, elif 85 <= rezultat < 90:, ali nisam. Zašto nisam, i zašto Python neće napisati sve poruke?
Jednostavno je – komanda je if! Kada Python naiđe na nju, proverava uslov, ako uslov nije zadovoljen, on traži odgovarajući elif, ako ga ima, proverava uslov, i ide dalje, ako nema elif-a, Python traži else i izvršava taj blok, a ako nema ni else – jednostavno nastavlja dalje sa izvršavanjem programa. Ali da se vratimo prema gore, ako je if uslov ispunjen, Python izvršava if blok, a posle preskače sve elif i else blokove i nastavlja sa programom. Znači, jedina komanda ovde je if, sve ostalo (elif i else) su njeni priključci, i Python će uvak izvršavati samo jedan od blokova, tj prvi u kom je uslov ispunjen!
Sada kada znamo kako komanda if funkcioniše, hajde da primenimo to u praksi!
Problem: Idem na posao...
Rešenje: Sačuvaj ovaj primer kao posao.py
#!/usr/bin/env python3 

########################################## 
# Skripta koja simulira jutarnje obaveze # 
########################################## 

# Na poslu treba da budemo u 8! 
posao = 8 
print('Koliko je sada sati i minuta?') 
sati = int(input('Sati je >> ')) 
minuta = int(input('Minuta >> ')) 

# Moramo imati neki  decimalni broj koji predstavlja trenutno vreme 
minuta /= 60   # ili minuta = minuta / 60 
sati += minuta # ili sati = sati + minuta 

vreme = int(input('Koliko ti minuta treba do posla pešice? ')) 
vreme /= 60 
# Krajnje vreme do koga možemo da lenčarimo, a da ne žurimo! 
kasno = posao - vreme 

# zakasnio si 
if sati > posao: 
    print('Upravo si dobio otkaz!') 
 
# Ne možeš pešice a da ne zakasniš 
elif sati > kasno: 
    print('Uzmi novčanik.') 
    print('Idi kolima.') 
    benzin = int(input('Koliko litara benzina imaš?')) 
    # Na rezervi si 
    if benzin <= 5: 
        print('Idi do pumpe da natočiš benzin!') 
        print('Vozi brže!') 
    else: 
        print('Opusti se, stižemo!') 
else: 
    prazan = input('Ako imaš hrane u frižideru lupi samo Enter, ako nemaš, možeš ovde da urličeš od muke... ')    
    # Ako ima nečega u frižideru nisi pritisnuo enter 
    # tj nije prazan 
    if not prazan: 
        print('Spremi doručak.') 
        print('Prijatno!') 
    else: 
        print('Uzmi novčanik.') 
    print('Uživaj u cvrkutu ptica, dok pešaka ideš na posao...') 

print('Šef ti je nervozan, dobio si otkaz!')
input()
U ovom primeru treba da budeš na poslu u osam sati, trebaju nam podaci o vremenu kada si ustao, i o vremenu koliko ti treba pešice do posla. Obrati pažnju da sam minute delio sa 60, kako bih dobio decimalni broj npr 7.5 je „sedam i po“ tj, pola osam (a mi kažemo da je 7 sati i trideset minuta). Posle toga sve je objašnjeno u skripti. Kada ovaj program pokrenemo par puta:
./posao.py 
Koliko je sada sati i minuta? 
Sati je >> 9 
Minuta >> 0 
Koliko ti minuta treba do posla pešice? 25 
Upravo si dobio otkaz! 
Šef ti je nervozan, dobio si otkaz! 

./posao.py 
Koliko je sada sati i minuta? 
Sati je >> 7 
Minuta >> 45 
Koliko ti minuta treba do posla pešice? 30 
Uzmi novčanik. 
Idi kolima. 
Koliko litara benzina imaš?4 
Idi do pumpe da natočiš benzin! 
Vozi brže! 
Šef ti je nervozan, dobio si otkaz! 

./posao.py 
Koliko je sada sati i minuta? 
Sati je >> 7 
Minuta >> 30 
Koliko ti minuta treba do posla pešice? 25 
Ako imaš hrane u frižideru lupi samo Enter, ako nemaš, možeš ovde da urličeš od muke... jhgfhds 
Uzmi novčanik. 
Uživaj u cvrkutu ptica, dok pešaka ideš na posao... 
Šef ti je nervozan, dobio si otkaz! 
Hajde sad malko i da se igramo....
Problem: Želim da napravim neku prostu igru.
Rečenje: Može igra pogađanja broja?
Da pojasnimo, mi kao programer treba da zadamo neki broj, dok korisnik (igrač) treba da ga pogodi. Sada kada znamo if komandu, sve deluje jednostavno, zar ne?
Ovaj program sačuvaj kao pogadjanje.py
#!/usr/bin/env python3 

######################## 
# Igra pogađanja broja # 
######################## 

# Zadajemo neki broj 
plata = 13000 

print('Ovo je igra pogađanja plate.') 
print('Ja sam tvoj oholi poslodavac, a ti si kandidat za radno mesto.') 
print('Ukoliko pogodiš kolika će da ti bude plata, dobijaš posao.') 
print('Ukoliko ne pogodiš, letiš napolje.') 

pogadjanje = int(input('Pogodi kolika ti je plata: ')) 

if pogadjanje == plata: 
    print('Čestitam, pogodio si. Takve analitičke sposobnosti ti nisu potrebne ovde gde se nose džakovi.') 
    print('Dobio si posao, onih 20 šlepera treba da budu prazni za pola sata....') 
elif pogadjanje < plata: 
    print('Ne, suviše si skroman, i podcenjuješ me, što znači da bi me podkradao.') 
    print('Pošto ja nisam nit lud, nit budala - gubi se!') 
else: 
    print('Ma šta bi ti? Jel bi i jahtu da ti poklonim?') 
    print('Kad bih davao tolike plate, brzo bih ja propao - gubi mi se sa očiju!') 
    
input('A sad - mrš iz moje kancelarije, bagro!')
U ovoj igri kandidat se nalazi u kancelariji svog „budućeg“ šefa. Ako pogodi visinu svoje plate biće primljen na posao. Hajde da testiramo par kandidata:
./pogadjanje.py Ovo je igra pogađanja plate. 
Ja sam tvoj oholi poslodavac, a ti si kandidat za radno mesto. 
Ukoliko pogodiš kolika će da ti bude plata, dobijaš posao. 
Ukoliko ne pogodiš, letiš napolje. 
Pogodi kolika ti je plata: 10000 
Ne, suviše si skroman, i podcenjuješ me, što znači da bi me podkradao. 
Pošto ja nisam nit lud, nit budala - gubi se! 
A sad - mrš iz moje kancelarije, bagro! 
./pogadjanje.py 
Ovo je igra pogađanja plate. 
Ja sam tvoj oholi poslodavac, a ti si kandidat za radno mesto. 
Ukoliko pogodiš kolika će da ti bude plata, dobijaš posao. 
Ukoliko ne pogodiš, letiš napolje. 
Pogodi kolika ti je plata: 14000 
Ma šta bi ti? Jel bi i jahtu da ti poklonim? 
Kad bih davao tolike plate, brzo bih ja propao - gubi mi se sa očiju! 
A sad - mrš iz moje kancelarije, bagro! 
./pogadjanje.py 
Ovo je igra pogađanja plate. 
Ja sam tvoj oholi poslodavac, a ti si kandidat za radno mesto. 
Ukoliko pogodiš kolika će da ti bude plata, dobijaš posao. 
Ukoliko ne pogodiš, letiš napolje. 
Pogodi kolika ti je plata: 13000 
Čestitam, pogodio si. Takve analitičke sposobnosti ti nisu potrebne ovde gde se nose džakovi. 
Dobio si posao, onih 20 šlepera treba da budu prazni za pola sata.... 
A sad - mrš iz moje kancelarije, bagro! 
Ako si se ranije susretao sa jezicima C ili C++ - u Pythonu nema switch komande. Kao što vidiš koriste se if..elif..else naredbe da bi se uradile iste stvari (i, u nekim slučajevima se koriste rečnici (dictionary) da bi se te stvari uradile brže).
Uh... Sada znamo da „razgranamo“ program, ali zar ne bi bilo divno i krasno, kada bi moglo sve to da se – ponavlja?

8 Kontrola izvršavanja
programa
Indeks 8.2 while komanda

Primjedbe

Popularno ovog meseca

Gde pronaći novosti sa facebook stranica nakon velike promene koja ga je zadesila?

Dva načina da vratite svoj Windows 10 na fabričke vrednosti

Kako preuzeti video koji je neko postavio na facebook-u bez upotrebe dodatnih programa?

Više neće biti moguć besplatan prelazak na Windows 10

Prijateljski meč ŠK "Titel" - ŠK "Bukovac"

Tu je novi Qt creator 4.4.0!

Kako manipulisati Windows licencom pomoću slmgr komande?

Fake poet

Da li je poželjno biti anoniman na internetu (ili se predstavljati punim imenom i prezimenom)?

Organizacija foldera i fajlova u Linux fajl sistemu