If naredba

Vrlo često u programima želimo da uradimo nešto ali samo ako je nešto drugo tačno ( istinito ). Python-ova if naredba je ono što nam treba u takvim slučajevima.

Jedan prost primer

Hajde da analiziramo takozvani pogodi-broj program. Računar izabere jedan slučajan broj a korisnik pokušava da pogodi koji je to broj, pa mu program potvrdi ako je pogodio. Da bi proverili da li je korisnik pogodio zamišljeni broj potrebna nam je nova naredba, naredba if .

from random import randint

broj = randint(1,10)
pokusaj = eval(input('Unesite broj: '))
if pokusaj==broj:
    print('Pogodili ste!')

Sintaksa za if naredbu je slična sintaksi za for petlju u tome što se završava sa dve tačke i što je sledeća linija (ili više linija) koda napisana sa razmakom na početku. Linije koje su napisane sa razmakom na početku biće izvršene samo ako je uslov iz if naredbe ispunjen odnosno ako je tačan (True). Kad se izvrše sve linije sa razmakom na početku, kažemo da je blok zaključen (završen).

Gornji program radi, ali je suviše jednostavan. Ako igrač ne pogodi ništa se ne događa. Možemo napraviti dodatak na if naredbu na sledeći način:

if pokusaj==broj:
    print('Pogodili ste!')
else:
    print('Žao nam je.  Zamišljeni broj je bio ', broj)

Dakle, dodali smo else naredbu koja ima značenje „inače“ i pokazuje šta treba uraditi ako uslov iz if naredbe nema vrednost tačno (True).

Uslovni (relacioni) operatori

Operatori za poređenje su ==, >, <, >=, <=, i !=. Ovaj poslednji ima značenje „nije jednako“. Evo nekoliko primera:

Izraz Opis
if x>3: ako je x veće od 3
if x>=3: ako je x veće ili jednako 3
if x==3: ako je x jednako 3
if x!=3: ako x nije jednako 3

Postoje još tri dodatna operatora koji se koriste za konstruisanje složenijih uslova. To su operatori: and, or, i not. Evo nekih primera:

if poena>=80 and poena<90:
    print('Vaša ocena je 9.')

if skor>1000 or vreme>20:
    print('Game over.')

if not (skor>1000 or vreme>20):
    print('Game continues.')

Redosled operacija u uslovima

Operacija and se izvršava pre operacije or, pa tako ako imate složeni uslov koji sadrži oba operatora možda će vam trebati zagrade da jasno izrazite redolsed operacija. Možete and da posmatrate kao množenje a or kao sabiranje. Evo jednog primera:

if (skor<1000 or vreme>20) and broj_pokušaja==0:
    print('Game over.')

Najčešće greške

Greška 1

Operator jednakosti ima dva znaka jednako. Zaista je česta greška da se zaboravi drugi znak jednako.

Neispravno Ispravno
if x=1: if x==1:

Greška 2

Česta greška je da se koristi and tamo gde treba or ili obrnuto. Posmatrajmo sledeće naredbe:

if x>1 and x<100:
if x>1 or x<100:

Prva naredba je ispravna. Ako je x bilo koja vrednost između 1 i 100, uslov će biti tačan (True). Ideja je da x treba da bude veće od jedan i manje od 100. S druge strane, druga naredba nije ono što smo želeli, jer je u njoj uslov tačan bilo da je x veće od 1, bilo da je x manje od 100. Zapravo svaki broj veći od jedan ispunjava taj uslov. Lekcija koju iz ovog možemo da izvučemo je da ako vaš program ne radi korektno proverite and i or operatore u uslovnim izrazima.

Greška 3

Jedna česta greška je i kada se napiše nešto ovako:

if poena>=80 and <90:

To će dovesti do sintaksne greške. Korektna naredba je:

if poena>=80 and poena<90:

S druge strane postoji jedan lep način skraćenog pisanja koji radi u Python-u (ali ne i u većini drugih programskih jezika):

if 80<=poena<90:

elif

Jedna jednostavna upotreba if naredbe je za određivanje ocene na osnovu broja poena. Recimo da je 90 i više poena desetka, 80 i više devetka, 70 i više osmica, 60 i više sedmica, 50 i više šestica, a sve ispod 50 petica. Evo kako to može biti izraženo u programu:

ponena = eval(input('Unesite broj poena: '))

if poena>=90:
    print('Deset')
if poena>=80 and poena<90:
    print('Devet')
if poena>=70 and poena<80:
    print('Osam')
if poena>=60 and poena<70:
    print('Sedam')
if poena>50 and poena<60:
    print('Sest')

else:

    print('Pet')

Gornji kod je ispravan i radi kako treba. Međutim postoji elegantniji način da se postigne isti rezultat:

poena = eval(input('Unesite broj poena: '))

if poena>=90:
    print('Deset')
elif poena>=80:
    print('Devet')
elif poena>=70:
    print('Osam')
elif poena>=60:
    print('Sedam')
elif poena>=50:
    print('Šest'):
else:
    print('Pet')

Sa posebnim if naredbama ( kao u prvom pokušaju ) svaki uslov se proverava bez obzira da li je to stvarno potrebno ili ne. Tako, ako je vrednost varijable poena 95, prvi program će štampati Deset, ali će nastaviti da proverava uslove za Devet, Osam i tako dalje, što je mali gubitak efikasnosti. Korišćenjem elif, čim se jedan uslov ispuni prestaje se sa ispitivanjem svih ostalih uslova do kraja bloka. Dodatna pogodnost je što su uslovi koje postavljamo u elif naredbama jednostavniji nego kod njima odgovarajućih if naredbi. Na primer, kada koristimo elif, drugi deo uslova iz druge if naredbe , poena<90, nije više potreban jer ovaj elif ne mora više da brine o poenima većim od 90 pošto je taj broj poena već procesiran prvom if naredbom.

Možete se potpuno lagodno osećati i bez elif naredbe, ali ona može često pojednostaviti vaš kod.

Vežbe

4.1 Napisati program koji traži od korisnika da unese dužinu u santimetrima. Ako korisnik unese negativnu dužinu program treba da mu saopštu da je uneo neispravnu vrednost. U suprotnom, program treba da konvertuje i štampa dužinu u inčima. U jednom inču ima 2.54 santimetra.

4.2 Tražite od korisnika da unese temperaturu. Zatim ga pitajte u kojim jednicama je temperatura, Celzijus ili Farenhajt. Program treba da konvertuje temperaturu u drugu jedinicu.Formule za konverziju su: F=9/5*C+32 i C=5/9*(F-32).

4.3 Tražite od korisnika da unese temperaturu u Celzijusima. Program treba da štampa poruku u zavisnosti od unete temperature prema sledećim pravilima:

a) Ako je temperatura manja od -273.15, štampati da je temperatura neispravna jer je ispod apsolutne nule.
b) Ako je tačno -273.15, štampati da je temperatura na apsolutnoj 0.
c) Ako je temperatura između -273.15 i 0, štampati da je temperatura ispod tačke mržnjenja.
d) Ako je temperatura 0, štampati da je temperatura na tački mržnjenja.
e) Ako je između 0 i 100, štampati da je temperatura u normalnom opsegu.
f) Ako je 100, štampati da je temperatura na tačku vrenja.
g) Ako je iznad 100, štampati da je temperatura iznad tačke vrenja.

4.4 Generišite jedan slučajan broj između 1 i 10. Tražite od korisnika da pogodi broj i štampajte odgovarajuću poruku ako je pogodio broj ili ako nije.

4.5 Prodavnica naplaćuje $12 jedinici proizvoda ako kupujete manje od deset proizvoda. Ako kupujete između 10 i 99 proizvoda, cena je $10 po proizvodu. Ako kupujete 100 ili više od 100 proizvoda cena je $7 po proizvodu. Napišite program koji traži od korisnika koliko proizvoda kupuje i štampa ukupnu cenu za tu kupovinu.

4.6 Napišite program koji traži od korisnika da unese dva broja i štampa Blizu ako su oni udaljeni manje od 0.001 međusobno, dok u suprotnom štama Nisu blizu.

4.7 Godina je prestupna ako je deljiva sa 4, izuzev godina koje su deljive sa 100 a nisu deljive sa 400. Napisati program koji traži od korisnika da unese godinu i štampa da li je ona prestupna ili ne.

4.8 Napišite program koji traži od korisnika neki broj pa štampa sve delioce tog broja. [Pomoć: operator % se koristi da se odredi da li je broj deljiv sa nečim.]

4.9 Napišite program tako da se deca mogu igrati množenja. Program treba da igračima zadaje 10 pitanja iz operacije množenja celih brojeva. Posle svakog odgovora program treba da im saopši da li su odgovorili tačno ili ne.

Pitanje 1: 3 x 4 = 12
Tačno!
Pitanje 2: 8 x 6 = 44
Pogrešno.  Tačan odgovor je 48.
itd.
Pitanje 10: 7 x 7 = 49
Tačno.

4.10 Napišite program koji traži od korisnika da unese vreme na satu između 1 i 12, zatim traži da unesu am ili pm koliko sati unapred treba ići. Štampati koliko će sati biti kada ptotekne uneto vreme uz odgovarajuće oznake za am ili pm. Dole je prikazan jedan primer.

Unestite sat: 8
am (1) ili pm (2)? 1
Koliko sati unapred? 5
Novi sat: 1 pm

4.11 Posuda sa bonbonima sadrži nepoznat broj bonbona i ako pogodite koliko bonbona ima u njoj osvajate sve bonbone. Vi pitate osobu čija je posuda sledeća pitanja: Ako se broj bonbona podeli ravnomerno na 5 osoba, koliko će bonbona ostati u posudi? Odgovor je 2. Onda pitate o podeli bonbona na 6 osoba i odgovor je 3. Na kraju pitate o podeli između 7 osoba i odgovor je 2. Kada bacite pogled na posudu možete reći da tamo ima manje od 200 bonbona. Napišite program kojim se određuje koliko bonbona ima u posudi.

4.12 Napišite program koji omogućava korisniku da protiv računara igra igru kamen-papir-makaze. Treba da bude pet rundi i posle pet rundi program treba da štampa ko je pobedio a ko izgubio ili je nerešeno.