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.")