Pogoji

Zdaj pa povejmo nekaj splošnejšega o pogojih. Kakšni vse so lahko? Najprej, pogoj je izraz. Torej nekaj, kar se da izračunati (po naši garažni definiciji izraza). Doslej so bili vsi naši izrazi nekako številski, aritmetični: v njih so nastopala števila in le-ta smo seštevali, množili, odštevali in kar se še takega dela s števili. Pogoji pa so logični izrazi. (V resnici se "logičnost" in "številskost" lahko poljubno prepletata, a to bomo mimogrede odkrili sproti.)

Rezultat logičnega izraza je logična vrednost. Logične vrednosti niso števila (torej niso int ali float) in niso nizi, torej so nekaj četrtega. Podatkovni tip, ki hrani logične vrednosti, se imenuje bool (iz Boolean, po slovensko Booleov). Medtem ko je različnih števil (int, float) kar veliko, ima tip bool lahko le eno od dveh vrednosti, True ali False. Tudi True in False rezervirani besedi.

S števili že znamo računati. Z nizi tudi malo. Kako pa računamo z logičnimi vrednostmi? Menda jih ne moremo kar tako seštevati in odštevati?

Za zdaj se delajmo, da ne. Kasneje bomo videli, da zna Python z logičnimi izrazi početi še to in ono zanimivo reč, ki pa za začetnika niso tako pomembne.

Za logične izraze so nam na voljo trije operatorji: or, and in not.

>>> True and True
True
>>> True and False
False
>>> False or True
True
>>> not False
True
>>> False or not False
True

(and, or in not so rezervirane besede.

Operator not ima prednost pred and, and pa pred or. Spet si lahko pomagamo z oklepaji: a or b and c pomeni isto kot a or (b and c) in bo resničen (True), če je resničen a ali pa sta resnična b in c. Izraz (a or b) and c pa bo resničen, če sta resnična a ali b (ali oba), poleg tega pa nujno še c. Pri tem seveda predpostavljamo, da a, b in c vsebujejo logične vrednosti.

Da bo reč lažje razumljiva, jo potrenirajmo na prav tem izrazu, vendar tako, da namesto a, b in c oziroma namesto "golih" True in False pišemo bolj "konkretne" izraze.

>>> 352 > 0
True
>>> 5 < 3
False
>>> 352 > 0 or 5 < 3
True
>>> 352 > 0 or 5 > 3
True
>>> 352 > 0 and 5 > 3
True
>>> 352 > 0 and 5 < 3
False
>>> 352 > 0 and not 5 < 3
True
>>> 10 > 8 or 352 > 0 and 5 < 3
True
>>> 10 > 8 or (352 > 0 and 5 < 3)
True
>>> (10 > 8 or 352 > 0) and 5 < 3
False
>>> (10 > 8 or 352 > 0) and not 5 < 3
True

Operatorja > in < pričakujeta na levi in desni neke reči, ki jih je mogoče primerjati; zadovoljna nista le s števili, temveč tudi z, recimo, nizi (primerjala jih bosta po abecedi), ne moreta pa primerjati števila z nizom. Njun rezultat je logična vrednost. Za "večje ali enako" in "manjše ali enako" uporabimo >= in <=.

Če želimo preveriti enakost dveh števil (ali, v splošnem, enakost dveh stvari), uporabimo dvojni enačaj, ==. Enojni enačaj je dobil svojo zadolžitev prejšnjo uro, namenjen je namreč prirejanju. Ali sta dve stvari različni, preverimo z !=.

>>> 1 + 1 == 2
True
>>> 1 + 1 != 2
False

Ne zamenjujte dvojnih in enojnih enačajev. Če pomotoma napišemo (a to se nam bo rekdo zgodilo),

 a == 1 + 1

s tem nismo priredili a-ju dvojke, temveč smo le preverili, ali je enak 2. Pogostejša napaka pa bo

 if a = 1:
    print("Vrednost a je ena")

Ta program pa je sintaktično nepravilen, saj Python za if pričakuje pogoj, mi pa smo napisali prireditveni stavek.

Zdaj pa Pythonova posebnost, ki je v drugih jezikih ne bo: operatorje smemo nizati. Izraz 10 < T < 20 je resničen, če je T med 10 in 20. Izraz 10 < T1 < T2 < 20 je resničen, če sta T1 in T2 med 10 in 20, pri čemer je T1 manjši od T2. Izraz T1 < 10 < T2 je resničen, če je T1 manjši od 10, T2 pa večji od deset. 10 < T1 == T2 < 20 je resničen, če sta T1 in T2 enaka in sta nekje med 10 in 20.

Če se torej končno vrnemo k suhcem in debeluhom: če bi se hoteli skoncentrirati le na te, ki so ravno pravšnji, bi lahko napisali, recimo

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

Če kdo napiše

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

ali celo

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

Ga bomo čudno gledali (((kdor hoče oklepaje, naj gre raje programirat v Lisp))). Prav po Pythonovsko pa se reče:

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