Loogiset operaattorit

Edellisessä painoindeksin laskevassa ohjelmassa tarkistettiin, että käyttäjän antama pituus ei ole nolla. Voi olla hyvinkin järkevää tarkistaa lisäksi, että pituus ei ole aivan liian suuri. Ei ole mitenkään epätavallista, että käyttäjä ei huomaa sitä, että pituus pitäisi antaa metreinä. Jos käyttäjä antaa vahingossa pituuden senttimetreinä, painoindeksistä tulee järjettömän pieni. Tämä on helppo estää lisäämällä ohjelmaan yksi tarkistus lisää. Jos esimerkiksi käyttäjän antama pituus on vähintään 3, voimme olla täysin varmoja siitä, että pituudessa on jokin virhe.

Aikaisemman ohjelman ehto jos pituus on suurempi kuin 0 pitäisi siis muuttaa muotoon jos pituus on suurempi kuin 0 ja pituus on pienempi kuin 3. Ehto pituus on pienempi kuin 3 on helppo kirjoittaa

pituus < 3.0

Nyt tarvitsemme kuitenkin ehdon, joka on tosi silloin, kun molemmat ehdoista jos pituus on eri kuin 0 ja pituus on pienempi kuin 3 ovat tosia ja epätosi aina, kun toinen tai molemmat näistä ehdoista ovat epätosia. Tällainen ehto saada aikaiseksi käyttämällä and- eli ja-operaattoria ehtojen välissä. Aikaisemman ohjelman ehdon

if pituus > 0:

sijasta ohjelmaan kirjoitetaankin nyt

if pituus > 0 and pituus < 3.0:

Muu ohjelma on täysin sama. Operaattori and on yksi loogisista operaattoreista. Tärkeitä loogisia operaattoreita on esitelty alla.

operaattori nimi merkitys
and ja tosi, jos molemmat lausekkeet tosia
or tai tosi, jos vähintään toinen lausekkeista tosi
not ei tosi, jos seuraava lauseke on epätosi

Esimerkiksi lausekkeen

x > 0 or y > 0

Arvo on True (tosi), jos joko muuttujan x arvo on nollaa suurempi tai muuttujan y arvo on nollaa suurempi tai niiden molempien arvo on suurempi kuin nolla.

Operaatioiden and ja or tapauksessa lasketaan ensin ensimmäisen (operaattoria edeltävän) lausekkeen arvo. Jos jo sen perusteella voidaan päätellä, että koko lausekkeen arvon on pakko olla True tai False, ei jälkimmäisen lausekkeen arvoa lasketa lainkaan. Käytännössä tämä tarkoittaa sitä, että jos and-operaattorin ensimmäisen operandin arvo on False, ei toisen operandin arvoa lasketa, vaan koko lausekkeen arvoksi tulee joka tapauksessa False. Vastaavasti, jos or-operaattorin ensimmäisen operandin arvo on True, ei jälkimmäisen operandin arvoa lasketa, vaan koko lausekeen arvoksi tulee aina True.

Tällä on merkitystä erityisesti niissä tapauksissa, joissa ensimmäisen lausekkeen totuusarvosta riippuu se, voidaanko jälkimmäisen lausekkeen totuusarvoa laskea lainkaan. Esimerkiksi lausekkeessa

(x != 0) and (10 / x > 0)

laskutoimitus 10 / x aiheuttaa nollalla jakamisen ja koko ohjelman kaatumisen, jos muuttujan x arvo on nolla. Python-ohjelmaan yllä olevan lausekkeen voi kuitenkin kirjoittaa huoletta, koska ensin tutkitaan ensimmäisen operandin (x != 0) totuusarvo. Jos kyseinen lauseke on epätosi (eli muuttujan x arvo on 0), ei jälkimmäisen operandin totuusarvoa tutkita lainkaan ja jakolasku jää näin suorittamatta.

Luettelon viimeisellä operaattorilla not on vain yksi operandi. Esimerkiksi lausekkeen

not (x < 0)

arvo on True, jos lausekkeen x < 0 arvo on False, ja päinvastoin.

Huomautus: Painoindeksiesimerkissä and-operaattorin käyttö ei ole välttämätöntä, sillä Python-ohjelmissa muuttujan arvon sijoittumista jollekin välille pystyy tutkimaan myös kirjoittamalla vertailuoperaattorit muuttujan molemmin puolin. Rivi

if pituus > 0 and pituus < 3.0:

voidaan siis korvata rivillä

if 0 < pituus < 3.0:

Näin voidaan tehdä kuitenkin vain silloin, kun tutkitaan muuttujan sijoittumista halutulle välille. Operaattori and on selvästi monikäyttöisempi, koska sen avulla voidaan yhdistää kaksi mitä tahansa ehtoa, joiden ei tarvitse edes sisältää samaa muuttujaa.