Pogojni stavki

Začnimo, kjer smo končali. Imamo program za izračun (in izpis) indeksa telesne teže.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) bmi = teza / visina ** 2 print("Indeks vaše telesne teže je", bmi)

Zdaj si želimo, da bi program povedal še, ali je uporabnik slučajno preobilen. Prvi, seveda napačni poskus, bi bil takšen.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) bmi = teza / visina ** 2 print("Indeks vaše telesne teže je", bmi) print("Potrebno bo shujšati!")

Program v tej obliki bi, v širši rabi, povzročal anoreksijo, saj vse po vrsti pošilja na hujšanje. Zadnjo vrstico, izpis poziva k hujšanju, mora izvesti le, če je bmi večji od 25 (ta meja namreč velja za mejo debelosti, oziroma, politično korektno, prekomerne telesne teže).

To storimo tako, da pred vrstico dodamo pogoj. Ta se glasi "če bmi > ;25", le v angleščini.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) bmi = teza / visina ** 2 print("Indeks vaše telesne teže je", bmi) if bmi > 25: print("Potrebno bo shujšati!")

Ne spreglejmo dveh pomembnih reči. Na konec pogoja smo postavili dvopičje. To ne služi le za okras: dvopičja ne smemo izpustiti. Python na tem mestu zahteva dvopičje. Druga, še opaznejša reč je, da smo drugo vrstico zamaknili. Sledilo bi ji lahko še več zamaknjenih vrstic, ki bi se izvedle le, le je pogoj izpolnjen.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) bmi = teza / visina ** 2 print("Indeks vaše telesne teže je", bmi) if bmi > 25: print("Potrebno bo shujšati!") print("Da, gospod ali gospa, preveč vas je skupaj.") print("Pregled je končan, oglasite se spet čez dva tedna.")

Tako kot smo zastavili zdaj, se printa, ki sta zamaknjena izvedeta le, če je oseba preobilna, zadnji print, ki je spet izven pogoja, pa se izvede v vsakem primeru.

Tale razlaga je - upam, da se strinjamo - skoraj nepotrebna, saj je to, v katerem primeru se izvede kaj, očitno že kar iz oblike programa. (To je razlog, zakaj je Python tako simpatičen jezik za začetnike: programe v njem je veliko lažje brati kot programe v kakem bolj kriptičnem jeziku.)

Program bi bil še bolj simpatičen, če bi tiste, ki niso predebeli, pohvalil.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) bmi = teza / visina ** 2 print("Indeks vaše telesne teže je", bmi) if bmi > 25: print("Potrebno bo shujšati!") print("Da, gospod ali gospa, preveč vas je skupaj.") else: print("Odlično, le še naprej jejte toliko kot doslej!") print("Pregled je končan, oglasite se spet čez dva tedna.")

Pogojnemu stavku (ups, nov izraz; računalnikarji nekaterim rečem rečemo stavek, ker pa vas tule ne bom mučil s terminologijo, si pod besedo stavek predstavljajte preprosto "kos programa") lahko sledi še else, ki vsebuje tisto, kar naj se zgodi, če pogoj ni izpolnjen.

Do sem vse lepo in prav, vendar: kaj bomo z anoreksičnimi? Program bi jim mirno svetoval nadaljnje hujšanje. Ne: pri takšnih, ki imajo BMI manjši od 18.5, moramo zastokati, naj vendar že začnejo jesti.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) bmi = teza / visina ** 2 print("Indeks vaše telesne teže je", bmi) if bmi > 25: print("Potrebno bo shujšati!") print("Da, gospod ali gospa, preveč vas je skupaj.") else: if bmi < 18.5: print("Trlica!") print("Zunaj so avtomati s sendviči in čokolado. Med pavzo si le postrezite!") else: print("Odlično, le še naprej jejte toliko kot doslej!") print("Pregled je končan, oglasite se spet čez dva tedna.")

Vidimo foro? Znotraj ifa ali elsea smemo ugnezditi nov pogoj. Zamikamo ga lepo naprej.

Da bodo reči še nekoliko daljše (a poučnejše, dodajmo še en print.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) bmi = teza / visina ** 2 print("Indeks vaše telesne teže je", bmi) if bmi > 25: print("Potrebno bo shujšati!") print("Da, gospod ali gospa, preveč vas je skupaj.") else: print("Predebeli ravno niste.") if bmi < 18.5: print("Trlica!") print("Zunaj so avtomati s sendviči in čokolado. Med pavzo si le postrezite!") else: print("Odlično, le še naprej jejte toliko kot doslej!") print("Pregled je končan, oglasite se spet čez dva tedna.")

Zdaj program vsem, ki niso predebeli, napiše dobro novico, da niso predebeli. Šele nato se loti preverjanja, da niso slučajno presuhi.

Da se ne izgubimo, spet malo skrajšajmo program.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) bmi = teza / visina ** 2 print("Indeks vaše telesne teže je", bmi) if bmi > 25: print("Potrebno bo shujšati!") else: if bmi < 18.5: print("Trlica!") else: print("Odlično, le še naprej jejte toliko kot doslej!")

Znotraj pogojnih stavkov seveda lahko pišemo tudi druge reči, ne le printov. Takole: uporabniki programa se bodo pogosto zmotili in namesto višine v metrih vpisali višino v centimetrih, zato jih bo program obtožil težke anoreksije. To lahko popravimo preprosto tako, da program še pred računanjem BMI preveri, ali je višina slučajno večja od, recimo, treh metrov. V tem primeru sklepa, da je uporabnik podal težo v centimetrih. Težavo reši tako, da številko, ki jo je vpisal uporabnik, deli s 100.

Začetek programa tako postane takšen.

teza = float(input("Teža: ")) visina = float(input("Telesna višina: ")) if visina > 3: visina = visina / 100 bmi = teza / visina ** 2

Naprej pa gre tako kot prej.

Operatorji za primerjanje, združevanje pogojev

Imamo > in <. Manjkajo nam še znaki za večje ali enako, manjše ali enako ter za različno. Na tipkovnici namreč ni videti ničesar primernega. Prva dva zapišemo z >= in <=. Različnost zapišemo kot !=. Ali je BMI različen od 22, bi zapisali bmi != 22.

V resnici pa nam manjka še eden: enakost. V programskih jezikih se izogibamo temu, da bi isti znak ali beseda pomenila različne reči (in tako povzročala dvoumnost). Ali je BMI enak 22 ne bi zapisali z bmi = 22, saj bi to očitno (precej) spominjalo na prirejanje. Ne, = je in bo rezerviran za prirejanje. Ali sta dve stvari enaki, se vprašamo z ==; torej bmi == 22.

Drugo, kar nam bo prišlo prav, je združevanje pogojev. Če se hočemo vprašati ali velja in to in ono, uporabimo and. Tako bi lahko napisali, recimo

if bmi >= 18.5 and bmi < 25: print("Čestitamo, ravno pravšnji ste.")

(Seveda gre tudi krajše, napisali bi lahko if 18.5 < bmi < 25:.

Če nas zanima, ali velja ali to ali ono, uporabimo or.

if bmi < 18.5 or bmi > 25: print("Ste presuhi ali pa predebeli. Za nadaljnjo diagnozo uporabite ogledalo.")

Končno, če želimo nekaj negirati, uporabimo not.

if not bmi < 18.5: print("Vi pa niste presuhi.")

Vse te ande, ore in note lahko kombiniramo po želji, tako kot smo vajeni iz logike pri matematiki. Operator and ima prednost pred or, not pa pred obema. Kadar je potrebno, pa uporabimo oklepaje.

Last modified: Sunday, 12 October 2014, 2:30 PM