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.

Vaja

*Kratkostično vrednotenje logičnih izrazov

Izvedi Počisti



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:

Izvedi Počisti



Vaja