Podobno kot ima množenje prednost pred seštevanjem, ima tudi operator and
prednost pred operatorjem or
, zato nam oklepajev v pogoju pri bloku if
ne bi bilo treba pisati. Operator not
pa ima prednost pred obema.
Kakšne vrednosti imajo naslednji izrazi? Najprej odgovori, nato preveri!
not (3 <= 5) or (6 == 3) not ((3 <= 5) and (6 == 3)) True or (1 == 2) and False (True or (1 == 2)) and False
Zaženimo program in vnesimo neko pozitivno celo število (npr. 3). Ker spremenljivka b ni definirana, bi se program moral še pred izpisom končati z napako. Vendar pa se to ne zgodi. Program sporoči napako, samo če je vneseno število negativno ali enako 0:
Vnesi celo število: -2 Traceback (most recent call last): File "primer.py", line 4, in <module> if (a > 0) or (a < b): NameError: name 'b' is not defined
Kaj se tu dogaja? Če sta podizraza v logičnem izrazu povezana z operatorjem or
in je prvi podizraz resničen, je celoten izraz resničen ne glede na vrednost drugega podizraza. Zato se drugi podizraz izračuna, samo če je prvi izraz neresničen. V izrazu (a > 0) or (a < b)
se bo podizraz a < b
izračunal samo v primeru, če velja a <= 0
. V nasprotnem primeru se bo podizraz a < b
preskočil, zato python spremenljivke b
sploh ne bo obravnaval. Temu načinu računanja logičnih izrazov pravimo kratkostično računanje.
Podobno velja za operator and
. Če sta podizraza povezana z operatorjem and
in je prvi podizraz neresničen, je vrednost celotnega izraza neresnična ne glede na vrednost drugega podizraza, zato se v tem primeru drugi podizraz enostavno preskoči.
Prejšnji primer se zdi nekoliko umeten, vendar pa nam kratkostično računanje logičnih izrazov velikokrat pride prav. Recimo pri programu za ugotavljanje, ali je prvo vneseno število deljivo z drugim:
Kaj se zgodi v primeru b == 0
? Kaj bi se zgodilo, če python logičnih izrazov ne bi računal kratkostično?