Logiske operatorer

I artikkelen om aritmetiske operatorer og regneoperasjoner og artikkelen om  sammenlikningsoperatorer blir vi kjent med to typer operatorer. Her skal vi møte en tredje type, logiske operatorer.

La oss si at vi har Python-kode for å lese inn et antall som må være større enn 0 og mindre enn 100. Hvis vi leser inn et ulovlig antall, skal vi få en feilmelding. Kontrollen av antallet kan vi gjøre med en ifelif-konstruksjon, som i eksempel 1.

Eksempel 1:

Koden under leser inn et antall og skriver en feilmelding hvis antallet <= 0 eller >= 100

antall = int(input("Oppgi antall: "))
if antall <= 0:  # For lavt antall
    print("Antall må være større enn 0 og mindre enn 100.")
elif antall >= 100: # For stort antall
    print("Antall må være større enn 0 og mindre enn 100.")

Vi kan imidlertid skrive koden på en enklere måte ved å slå sammen de to kontrollene av antall ved hjelp av den logiske operatoren or, slik det er vist i eksempel 2.

Eksempel 2:

Koden under gjør det samme som koden i eksempel 1, men med betingelsene antall <= 0 og antall >= 100 kjedet sammen med or.

antall = int(input("Oppgi antall: "))
if antall <= 0 or antall >= 100:  # Ulovlig antall
    print("Antall må være større enn 0 og mindre enn 100.")

Operatoren or kjeder to betingelser sammen til én, som er sann hvis minst én av betingelsene er sann, men usann hvis begge betingelsene er usanne.

Dette er oppsummert under. Her bruker vi Python-kodeordene True for sann, og False for usann.

True or TrueTrue
True or FalseTrue
False or TrueTrue
False or FalseFalse

Vi har også en logisk operator som heter and. and kjeder to betingelser sammen til én som er sann hvis begge betingelsene er sanne, men usann ellers.

True and TrueTrue
True and FalseFalse
False and TrueFalse
False and FalseFalse

Eksempel 3:

Hvis vi kjører koden under i Python, får vi skrevet ut True.

x = 3
y = 4
print( x > 0 and y > 0)

Oppgave 1:

Analyser Python-koden under og avgjør om den vil skrive ut True eller False. Sjekk så om du har rett ved å kjøre koden.

x = -3
y = 4
print( x > 0 or x < y)

Se løsningsforslag

En tredje logisk operator er not, som gjør en sann betingelse usann, og en usann betingelse sann:

not TrueFalse
not FalseTrue

True, False, or, and og not er kodeord i Python. Legg merke til at True og False skrives med stor forbokstav, mens or, and og not skrives med liten forbokstav.

I artikkelen om sammenlikningsoperatorer lærer vi at True og False kalles boolske datatyper, og vi ser her at når vi bruker or, and eller not på boolske datatyper, er resultatet også en boolsk datatype.

Prioritet

Logiske operatorer har prioritet, på samme måte som aritmetiske operatorer. 

I sammensatte uttrykk brukes operatorene i denne rekkefølgen:

    1. () Parenteser. Parenteser inni hverandre beregnes innenfra og ut.
    2. not
    3. and
    4. or

Operatorer med samme prioritet brukes fra venstre mot høyre.

Eksempel 4:

Vi skal studere i hvilken rekkefølge operatorene brukes i uttrykket:
True or not True and False

not har høyest prioritet, det første som skjer er derfor at not True blir til False:
True or False and False

Deretter er det and som har høyest prioritet, så False and False blir False:
True or False

Så er det bare or igjen, og True or False blir True:
True

Oppgave 2:

Analyser de to linjene med Python-kode under, og avgjør om de vil skrive ut True eller False. Sjekk så om du har rett ved å kjøre koden.

print(True or False and False)
print(True and False or not(False and True))

Se løsningsforslag

Samme betingelse kan ofte formuleres på flere måter.

Eksempel 5:

I eksempel 2 brukte vi koden under for å sjekke om antall var mindre eller lik 0 eller større eller lik 100:

if antall <= 0 or antall >= 100:

Her sier vi altså «Hvis antall er mindre eller lik 0 eller antall er større eller lik 100″. En annen måte å uttrykke akkurat det samme på er «Hvis ikke antall er større enn 0 og antall samtidig er mindre enn 100″, som vi kan skrive slik i Python-kode:

if not(0 < antall and antall < 100):

Slå sammen betingelser

La oss si at vi har en variabel, x, og at vi skal gjøre en forgreining hvis x er større enn 5 og samtidig mindre enn 10. Det kan vi gjøre med følgende Python-kode, der vi har to betingelser kombinert med and:

if 5 < x and x < 10:

Python lar oss imidlertid slå sammen de to betingelsene slik vi ville gjort i matematisk notasjon:

if 5 < x < 10:

Eksempel 6:

I eksempel 5 hadde vi følgende kode:

if not(0 < antall and antall < 100):

Denne koden kan vi ved å slå sammen betingelsene omforme til

if not(0 < antall < 100):

Den kompakte, matematiske notasjonen i eksempel 5 og 6 er lett å lese. Men medaljen har en bakside. Når Python treffer på et uttrykk på formen a operator b operator c, blir dette mekanisk tolket som a operator b and b operator c. Det betyr at uttrykk som er ugyldige matematisk, allikevel vil være akseptable i Python, for eksempel vil > b bli tolket som x and x > b.

Det er også viktig å være oppmerksom på at den kompakte notasjonsformen er spesiell for Python. I programmeringsspråk som C og JavaScript vil sammenslåtte betingelser bli tolket på en måte som høyst sannsynlig ikke er den vi ønsker.

Kilder

    • Matthes A. (2019). Python Crash Course. no starch press

True og False har også aritmetiske verdier i Python, True har verdien 1, og False har verdien 0. Det betyr at hvis vi skriver print(True + True), skriver Python ut 2, mens hvis vi skriver print(False + False), skriver Python ut 0.

I JavaScript skrives True og False med liten forbokstav, altså true og false. C har ikke boolske datatyper, i stedet brukes 1 som True og 0 som False.

Hvis vi i språk som C og JavaScript setter sammen uttrykk med flere sammenlikningsoperatorer, for eksempel 5 < x < 10, blir operatorene brukt fra venstre mot høyre. Resultatet av en sammenlikning er enten sann eller usann, noe som representeres med henholdsvis 1 eller 0. Denne verdien blir så brukt i neste sammenlikning.
I C eller JavaScript vil et uttrykk som 5 < 20 < 10 bli sant fordi det blir regnet ut slik:
(5 < 20) < 10 → 1 < 10 → 1
I Python blir imidlertid resultatet usant fordi det blir regnet ut slik:
 (5 < 20) and (20 < 10) → 1 and 0 → 0