CMD + K

Informasjonsteknologi grunnkursBetingelser og logiske uttrykkBegreper & formler6
6 min lesing1 video

Betingelser og logiske uttrykk

Programmer må kunne velge ulike veier ut fra situasjonen. Med sammenligninger og de logiske operatorene and, or og not bygger vi boolske uttrykk, og med if/elif/else lar vi koden forgrene seg. Dette er kjernen i all beslutningslogikk.

Læringsmål
  • 01Forklare datatypen bool og hvordan sammenligningsoperatorer som ==, !=, < og >= gir sannhetsverdier
  • 02Skille tilordning (=) fra sammenligning (==) og forklare hvorfor innrykk avgjør hvilke linjer som hører til en blokk
  • 03Bygge forgreninger med if, elif og else, og forklare hvorfor bare den første sanne grenen kjører
  • 04Kombinere betingelser med and, or og not og lese av resultatet i en sannhetstabell

Når programmet må velge vei

Et program som alltid gjør det samme er av begrenset nytte. Et minibank-program må sjekke om du har dekning før det utbetaler. Et spill må sjekke om du traff målet. Et innloggingssystem må sjekke om passordet stemmer. I alle disse tilfellene står programmet ved et veiskille og må velge ulik handling ut fra situasjonen. Det er dette betingelser handler om: å la koden forgrene seg.

Grunnsteinen er sannhetsverdien — en verdi som er enten sann eller usann. I Python heter datatypen bool, og den har nøyaktig to mulige verdier: True og False. Alt forgreningsmaskineriet bygger på denne ene lille typen. Når vi spør programmet «har brukeren dekning?», er svaret en bool, og det svaret avgjør hvilken vei koden tar.

Sammenligninger gir sannhetsverdier

Hvordan får vi en bool? Den vanligste måten er en sammenligning. Når vi sammenligner to verdier, svarer Python med True eller False:

python
print(5 > 3) # True print(2 == 2) # True print(10 < 4) # False print("a" != "b") # True

De viktigste sammenligningsoperatorene er > (større enn), < (mindre enn), >= (større eller lik), <= (mindre eller lik), == (lik) og != (ulik). Vær spesielt oppmerksom på == med to likhetstegn. Ett likhetstegn, =, betyr tilordning — «sett variabelen til denne verdien». To likhetstegn, ==, spør «er disse to like?». Å forveksle dem er kanskje den vanligste begynnerfeilen som finnes, og Python gir deg en feilmelding hvis du prøver if x = 5, nettopp fordi det er en så lett tabbe.

if — den enkleste forgreningen

Den enkleste forgreningen er en if-setning. Den kjører en blokk med kode bare hvis en betingelse er sann:

python
alder = int(input("Hvor gammel er du? ")) if alder >= 18: print("Du er myndig.")

To ting er verdt å merke seg. Først kolonet etter betingelsen — det avslutter if-linja og varsler at nå kommer blokken. Deretter innrykket: linja under if er rykket inn (vanligvis fire mellomrom), og det er innrykket, ikke noe annet, som forteller Python hvilke linjer som hører til blokken. Python bruker innrykk der mange andre språk bruker krøllparenteser. Slurver du med innrykket, endrer du betydningen av koden.

En blokk kan inneholde flere linjer, og alle som er rykket like langt inn hører til samme blokk:

python
if alder >= 18: print("Du er myndig.") print("Du kan stemme ved valg.") print("Dette skrives uansett.")

De to første utskriftene kjører bare når betingelsen er sann, fordi de er rykket inn under if. Den siste står på «yttergrensa» igjen, utenfor blokken, og kjører derfor alltid — uansett alder. Det er denne forskjellen i innrykk som avgjør hva som er betinget og hva som ikke er det.

if-elif-else — flere veier

Ofte vil vi velge mellom flere muligheter, ikke bare gjøre eller ikke gjøre. Da utvider vi med elif (kort for «else if») og else. Tenk på et program som gir en karakter ut fra poengsum:

grenvalg

Karakter ut fra poengsum med if-elif-else

python
poeng = int(input("Poeng: "))if poeng >= 90:    print("A")elif poeng >= 80:    print("B")elif poeng >= 60:    print("C")else:    print("Stryk")

Betingelsene sjekkes ovenfra og ned. Den første som er sann velger karakter, og resten hoppes over. Derfor må de strengeste grensene stå øverst.

Slik kjører Python en slik kjede: den sjekker betingelsene ovenfra og ned, stopper ved den første som er sann, kjører den blokken, og hopper over resten. else på slutten fanger opp alt som ingen av betingelsene traff. Dette kalles en if-elif-else-struktur, og den er ryggraden i nesten all beslutningslogikk.

Rekkefølgen er viktig nettopp fordi bare den første sanne grenen kjører. Hadde vi i karakter-eksempelet skrevet if poeng >= 0 øverst, ville alle med positiv poengsum fått den karakteren, og resten av kjeden ville aldri blitt sjekket. Tommelfingerregel: sjekk de mest spesifikke eller «strengeste» betingelsene først.

janeijaneijaneiStartpoeng >= 90 ?Skriv Apoeng >= 80 ?Skriv Bpoeng >= 60 ?Skriv CSkriv StrykSluttFørste sanne betingelse velger gren; resten hoppes over.
FIGFlyten gjennom en if-elif-else

Logiske operatorer — å kombinere betingelser

Noen ganger avhenger valget av flere ting samtidig. «Du får rabatt hvis du er student og under 30.» «Du slipper inn hvis du har billett eller er på gjestelista.» For å uttrykke slikt har vi tre logiske operatorer: and, or og not.

and er sann bare når begge sidene er sanne. or er sann når minst én side er sann. not snur en sannhetsverdi — not True blir False, og omvendt:

python
student = True alder = 25 if student and alder < 30: print("Du får studentrabatt.")

Hvordan disse oppfører seg er lettest å se i en sannhetstabell, der vi lister opp alle mulige kombinasjoner av inn-verdier og hva operatoren gir ut:

Logiske operatorerABA and BbeggeA or Bminst énnot AFalseFalseFalseFalseTrueFalseTrueFalseTrueTrueTrueFalseFalseTrueFalseTrueTrueTrueTrueFalseand krever begge sanne; or krever minst én; not snur verdien.
FIGSannhetstabell for and, or og not

Les tabellen rad for rad. Når både A og B er usanne, gir and usant og or usant. Så snart minst én er sann, slår or om til sann, mens and krever at begge er sanne før den blir det. Dette mønsteret — or er «raus», and er «streng» — er verdt å ha i ryggmargen.

Et nyttig poeng er at not binder sterkere enn and, som igjen binder sterkere enn or, akkurat som gange binder sterkere enn pluss i regning. Det betyr at not a or b leses som (not a) or b, ikke som not (a or b). Når et logisk uttrykk blir det minste sammensatt, lønner det seg å sette parenteser rundt delene du mener hører sammen — både for at Python skal gjøre det du tror, og for at den som leser koden senere skal slippe å gjette. (student and ung) or ansatt er mye lettere å lese enn den samme logikken uten parenteser.

Sannhetsverdier av andre verdier

Python lar deg også bruke andre verdier enn rene bool i en betingelse, og tolker dem da som sanne eller usanne. Tallet 0, den tomme strengen "" og den tomme lista regnes som usanne; alle andre tall, ikke-tomme strenger og ikke-tomme lister regnes som sanne. Det betyr at if navn: er en kort måte å si «hvis navn ikke er tomt». Dette er praktisk, men også en kilde til forvirring i starten, så bruk det bevisst. Tilsvarende er if not liste: en lesbar måte å si «hvis lista er tom». Vil du heller være helt tydelig, kan du alltid skrive betingelsen ut i sin fulle form, for eksempel if len(navn) > 0:. Begge fungerer; valget er et spørsmål om hva som er lettest å lese i sammenhengen.

Et samlet eksempel

La oss knytte det til forrige kapittel og lese inn data først, så velge vei:

python
poeng = int(input("Hvor mange poeng fikk du? ")) if poeng >= 90 and poeng <= 100: print("Strålende!") elif poeng >= 50: print("Bestått.") else: print("Ikke bestått — prøv igjen.")

Her ser du alt sammen: input og casting fra kapittel 3, en sammenligning, en and-kombinasjon, og en if-elif-else-kjede som velger nøyaktig én av tre utskrifter. Legg merke til at vi kunne skrevet 90 <= poeng <= 100 i stedet — Python tillater slike lenkede sammenligninger, og de leses akkurat som i matematikken.

Vanlige feller

Den hyppigste feilen er som nevnt = mot ==. Den nest hyppigste er innrykk: blander du mellomrom og tabulator, eller rykker ulikt inn i samme blokk, får du en IndentationError. Den tredje er å skrive flere if-er der man mente elif. Skriver du tre separate if-er, sjekkes alle tre uavhengig, og flere blokker kan kjøre. Med elif kjører høyst én. Når et program ser ut til å gjøre «for mye», er det ofte fordi en elif ble til en if.

Med betingelser på plass kan programmene dine ta valg. I neste kapittel lar vi dem gjenta arbeid med løkker — og da kombinerer vi forgrening og repetisjon til ekte algoritmer.

Mine notater

Skriv egne notater for dette kapittelet. De lagres automatisk og dukker opp i «Mine notater»-oversikten paa fag-siden.

Laster…