Tilbake
1.2

1.2 Betingelser og boolske uttrykk

`if/elif/else`, sammenligning og de logiske operatorene `and`/`or`/`not` — forgreningen som all kodesporing og all funksjonslogikk hviler på.

40 min
8 oppgaver
Betingelserboolske uttrykk
Din fremgang i kapitlet
0 / 8 oppgaver
Kapitlets plass i kurset

Forkunnskaper — sist du var her

Kap. 1.1 — Variabler, datatyper og uttrykk. Du trenger derfra:

- at en tilordning (x = 3) regner ut høyre side og lar navnet peke på
resultatet — og at = derfor ikke betyr «er lik»,
- at verdier har en type, og at 3 og "3" er ulike verdier,
- de to boolske verdiene True og False, skrevet med stor forbokstav og
uten anførselstegn,
- at print skiller argumenter med ett mellomrom.

Kort oppfrisket:

alder = 17 navn = "Ada" er_myndig = False print(navn, alder, er_myndig)

Utskrift:

Ada 17 False

Løkke 1 — Sammenligninger gir sant eller usant (~8 min)

Et program som skal gjøre noe bare av og til, må kunne stille et spørsmål med ja-eller-nei-svar. «Er alderen over 18?» «Er navnet det samme som det jeg leter etter?»

Slike spørsmål stiller du med en sammenligning, og svaret er alltid én av de to boolske verdiene fra forrige kapittel: True eller False.

`==` — er lik

Sammenligner to verdier og gir True hvis de er like:

print(3 == 3)
print(3 == 4)

Utskrift:

True
False

Legg merke til de to likhetstegnene. Ett likhetstegn er en tilordning som endrer en variabel; to likhetstegn er et spørsmål som gir et svar. Det er to helt forskjellige ting, og å blande dem er en klassisk feil.

== sammenligner verdier, ikke typer, men typene må kunne sammenlignes: 3 == 3 er True, mens 3 == "3" er False — et tall er aldri lik en tekst.

`!=` — er ulik

Det motsatte av ==: gir True når verdiene er forskjellige.

print(3 != 4)
print("ja" != "ja")

Utskrift:

True
False

Utropstegnet leses som «ikke». a != b betyr «a er ikke lik b», og er nøyaktig det samme som not (a == b).

`<`, `>`, `<=` og `>=`

De fire størrelsessammenligningene: mindre enn, større enn, mindre enn eller lik, større enn eller lik.

print(5 < 5)
print(5 <= 5)

Utskrift:

False
True

Forskjellen mellom de to linjene er hele kapitlets viktigste detalj. < slipper ikke gjennom når verdiene er like; <= gjør det.

På eksamen er dette kanten: en oppgave som sier «18 år eller eldre», krever
>=, ikke >. Å teste med en verdi som ligger nøyaktig på kanten, er den raskeste måten å avsløre feilen på.

Boolsk uttrykk

Et uttrykk som gir True eller False. Alle sammenligninger er boolske uttrykk, og det samme er en variabel som holder på en boolsk verdi.

alder = 20 er_myndig = alder >= 18 print(er_myndig)

Utskrift:

True

Legg merke til at resultatet kan lagres i en variabel, akkurat som et tall. Det er ofte den ryddigste måten å skrive kode på: gi den boolske verdien et beskrivende navn, og bruk navnet i betingelsen etterpå.

Sammenligning av tekst

Strenger kan også sammenlignes. == og != gjør det du forventer: to strenger er like når de har nøyaktig de samme tegnene, i samme rekkefølge, med samme store og små bokstaver.

print("Ada" == "Ada")
print("Ada" == "ada")

Utskrift:

True
False

Størrelsessammenligning virker også, og følger tegnenes rekkefølge — omtrent som i en ordbok: "ape" < "bil" er True. Men vær forsiktig: store bokstaver kommer før alle små, så "Ø" < "a" er True. På eksamen dukker størrelsessammenligning av tekst sjelden opp; det er likhetstesten du bruker.

✏️Eksempel 1: Kanten som avgjør

En kinobillett koster halv pris for alle som er 15 år eller yngre. Skriv testen som avgjør om Nora på 15 får rabatt, og vis hvorfor den ene av de to opplagte testene er gal.

Den riktige testen bruker <=, fordi teksten sier «eller yngre»:

alder = 15 print(alder <= 15)
print(alder < 15)

Utskrift:

True
False

Første linje er svaret oppgaven ber om: Nora får rabatt.

Andre linje er den vanligste feilen. < betyr «strengt mindre enn», og utelukker dermed nøyaktig den ene alderen som ligger på grensen. En kandidat som skriver
alder < 15, gir alle fjortenåringer rabatt og nekter alle femtenåringer — og feilen viser seg bare for én eneste verdi.

Vanen som redder deg: når en oppgave nevner en grense, test med verdien som
ligger grensen. Er svaret riktig der, er resten som regel riktig også.

📝Oppgave 1

(Innstegsoppgave — ren gjengivelse.) La poeng = 60.

a) Hva gir poeng == 60?

b) Hva gir poeng > 60?

c) Hva gir poeng >= 60?

d) Hva gir poeng != 60?

Løkke 2 — if, else og elif (~12 min)

En sammenligning som bare gir True er ikke til stor nytte i seg selv. Poenget er å styre hva programmet gjør: kjør disse linjene bare hvis svaret er sant.

Det er if som gjør det, og innrykket som avgjør hvor langt «disse linjene»
strekker seg.

`if`

Kjører linjene under, men bare hvis betingelsen er sann:

alder = 20 if alder >= 18:
    print("myndig")
print("ferdig")

Utskrift:

myndig ferdig

Tre formkrav som Python er ubøyelig på:

- Kolon etter betingelsen.
- Innrykk på linjene som hører til. Boka bruker fire mellomrom.
- Linjer uten innrykk hører ikke til, og kjøres uansett — som print("ferdig")
over.

Er betingelsen usann, hoppes hele den innrykkede blokken over, og programmet fortsetter på første linje uten innrykk.

Innrykk som blokk

Python bruker innrykk der andre språk bruker klammeparenteser. Alle linjene med samme innrykk under en if utgjør én blokk, og blokken kjøres samlet eller ikke i det hele tatt.

sum_poeng = 12 if sum_poeng > 10:
    sum_poeng = sum_poeng + 5 print(sum_poeng)
print("slutt")

Utskrift:

17 slutt

Begge de innrykkede linjene hørte til betingelsen. Den siste gjorde ikke.

Regelen er absolutt: innrykket er ikke pynt, det er betydning. Flytter du en linje inn eller ut, endrer du hva programmet gjør — ikke bare hvordan det ser ut.

`else`

Kjører når betingelsen er usann:

alder = 15 if alder >= 18:
    print("myndig")
else:
    print("mindrearig")

Utskrift:

mindrearig

else har ingen egen betingelse — den fanger opp alt som ikke traff. Nøyaktig én av de to blokkene kjøres, aldri begge og aldri ingen.

else er valgfri. En if uten else betyr rett og slett «gjør ingenting hvis betingelsen er usann».

`elif`

En ekstra betingelse som bare prøves hvis den forrige var usann:

poeng = 72 if poeng >= 90:
    print("A")
elif poeng >= 60:
    print("C")
else:
    print("F")

Utskrift:

C

Ordet er en sammentrekning av «else if». Du kan ha så mange elif-grener du vil mellom if og else.

Rekkefølgen betyr alt: grenene prøves ovenfra og ned, og den første som er sann, vinner. Derfor må den strengeste betingelsen stå øverst. Hadde `poeng >=
60 stått først i eksempelet over, ville alle med 90 poeng også fått C`.

Bare den første sanne grenen kjøres

I en kjede av if, elif og else kjøres nøyaktig én blokk: den første grenen som er sann. Resten hoppes over, selv om de også ville vært sanne.

x = 100 if x > 10:
    print("over ti")
elif x > 50:
    print("over femti")

Utskrift:

over ti

Verdien er både over ti og over femti, men bare den første grenen kjørte.

Dette skiller elif skarpt fra å skrive to selvstendige if-setninger etter hverandre. To if-er er to uavhengige spørsmål, og begge kan slå til.

✏️Eksempel 2: Karakterkjeden sporet gren for gren

Et program setter karakter etter poengsum. Hva skriver det ut for poeng = 72, og hvorfor er rekkefølgen på grenene avgjørende?

poeng = 72 if poeng >= 90:
    print("A")
elif poeng >= 80:
    print("B")
elif poeng >= 60:
    print("C")
else:
    print("stryk")

Gå gjennom grenene ovenfra, og stopp ved den første som er sann.

GrenBetingelseVerdiKjøres?
if72 >= 90Falsenei
elif (1)72 >= 80Falsenei
elif (2)72 >= 60Trueja
elsenei, en gren har allerede truffet

Utskrift:
C
Hvorfor rekkefølgen avgjør: betingelsen poeng >= 60 er sann for 72, men den
er også sann for 95. Sto den øverst, ville alle bestått-poengsummer fått C, og
A-grenen ville aldri blitt nådd.

Regelen for slike kjeder er derfor: sorter grenene fra strengest til mildest. Da fanger hver gren nøyaktig sitt intervall, og else fanger resten.

📝Oppgave 2
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig, med linjeskift slik terminalen viser den.

tall = 8 if tall > 5:
    print("stor")
elif tall > 3:
    print("middels")
else:
    print("liten")
print("ferdig")

📝Oppgave 3
Eksamensnivå, sjanger A

De to programmene har samme verdier og samme betingelser. Hva skriver hvert av dem ut?

a)

x = 12 if x > 10:
    print("A")
elif x > 5:
    print("B")

b)

x = 12 if x > 10:
    print("A")
if x > 5:
    print("B")

Løkke 3 — Å kombinere betingelser: and, or og not (~10 min)

Ofte holder det ikke med ett spørsmål. «Er personen mellom 18 og 67?» er to spørsmål som begge må være sanne. «Er dagen lørdag eller søndag?» er to spørsmål der det holder at ett er sant.

Tre små ord binder betingelser sammen.

`and`

Sann bare når begge sidene er sanne:

alder = 20 print(alder >= 18 and alder < 67)
print(alder >= 18 and alder < 20)

Utskrift:

True
False

Andre linje er usann fordi høyre side er usann, selv om venstre side er sann.
and krever begge.

Slik skrives et intervall i denne boka: to hele sammenligninger med and mellom, som alder >= 18 and alder < 67. Python tillater også kortformen
18 <= alder < 67, men den fulle formen er tydeligere å spore og er stilen i fagets egne løsningsforslag.

`or`

Sann når minst én av sidene er sann:

dag = "lordag" print(dag == "lordag" or dag == "sondag")
print(dag == "mandag" or dag == "sondag")

Utskrift:

True
False

Merk at or også er sann når begge sidene er sanne — det er «minst én», ikke
«nøyaktig én».

En vanlig feil er å skrive dag == "lordag" or "sondag". Det er ikke en sammenligning på høyre side, og uttrykket gir ikke det du tror. Skriv hele sammenligningen på begge sider av or.

`not`

Snur en boolsk verdi:

er_ledig = False print(not er_ledig)

Utskrift:

True

not står foran uttrykket det snur, og binder sterkere enn både and og or.

Bruk not når det gjør setningen lettere å lese, ikke som en vane. not (a == b) bør skrives a != b, og not (x > 5) bør skrives x <= 5 — begge er kortere og lettere å spore.

Rekkefølgen mellom `not`, `and` og `or`

Når flere av dem står i samme uttrykk, gjelder denne rekkefølgen, fra sterkest til svakest:

1. not
2. and
3. or

Sammenligninger som >= og == regnes ut før alle tre.

Det betyr at a or b and c leses som a or (b and c), ikke som
(a or b) and c. De to gir ulikt svar, og forskjellen er en fast kilde til sporingsoppgaver.

Som med regnerekkefølgen i kap. 1.1: er du i tvil, sett parenteser. De koster ingenting og fjerner all tvil.

✏️Eksempel 3: Når `and` og `or` står i samme uttrykk

Hva skriver programmet ut, og hva ville svaret vært hvis parentesen sto rundt
or-delen i stedet?

a = True b = False c = True print(a or b and c)
print((a or b) and c)
print(a and b or c)

Bruk rekkefølgen: and binder sterkere enn or.

UttrykkLeses somRegnestykkeVerdi
a or b and ca or (b and c)True or (False and True) er True or FalseTrue
(a or b) and csom skrevet(True or False) and True er True and TrueTrue
a and b or c(a and b) or c(True and False) or True er False or TrueTrue

Utskrift:
True
True
True
Alle tre ble sanne her, og det er med vilje: eksempelet viser at samme svar ikke betyr samme regnestykke. Bytt c til False, og de tre linjene gir
True, False, False.

Slik sporer du det på eksamen: sett inn True og False for hver variabel
først, sett så parenteser rundt hver and, og regn utenfra og inn.

📝Oppgave 4
Eksamensnivå, sjanger A

La x = 4.

a) Hva gir x > 2 and x < 10?

b) Hva gir x > 2 or x > 100?

c) Hva gir not x == 4?

d) Hva gir x > 10 or x > 2 and x < 3?

📝Oppgave 5
Eksamensnivå, sjanger…

Skriv én linje som skriver ut ja når en person kan bestille ungdomsbillett. Reglene er:
alderen må være minst 16 og under 20.

a) Skriv if-setningen med and.

b) Hvilke to aldre er de kritiske å teste med?

c) Hva blir galt hvis du skriver alder > 16 i stedet for alder >= 16?

Løkke 4 — Nøstede betingelser og medlemskapstesten (~8 min)

To siste ting før kapitlet er ferdig: hva som skjer når en if står inni en annen, og en liten test som blir svært nyttig senere.

Nøstet `if`

En if kan stå inne i en annen. Da må den ytre være sann for at den indre i det hele tatt skal prøves:

alder = 20 har_bevis = True if alder >= 18:
    if har_bevis:
        print("kan kjore")
    else:
        print("mangler bevis")
else:
    print("for ung")

Utskrift:

kan kjore

Innrykket viser hvem som hører til hvem: den indre else hører til den indre
if, fordi de har samme innrykk.

Nøsting er nyttig når det andre spørsmålet bare gir mening dersom det første er besvart. Men to nivåer er som regel nok — trenger du tre, er and ofte et ryddigere valg.

`in` — er dette med her?

Tester om noe forekommer i noe annet, og gir True eller False:

navn = "Aleksander" print("eks" in navn)
print("ø" in navn)

Utskrift:

True
False

På en tekst spør in om en delstreng finnes.

Den samme testen virker på de datastrukturene du møter i Del 3: if tall in tallene: spør om en verdi finnes i en liste, og if navn in ordbok: spør om en nøkkel finnes i en ordbok. Da blir in en av de viktigste konstruksjonene i faget — den er selve inngangen til teller-mønsteret i
kap. 3.2. Her nøyer vi oss med teksten.

not in finnes også, og betyr det motsatte.

`=` mot `==`

De to mest forvekslede tegnene i faget:

- = er en tilordning: x = 3 endrer x.
- == er en sammenligning: x == 3 spør, og gir True eller False.

Skriver du if x = 3: stopper Python med en feilmelding — heldigvis, for da oppdager du det med en gang.

Den motsatte forvekslingen er farligere: skriver du x == 3 der du mente en tilordning, skjer det ingenting i det hele tatt. Uttrykket regnes ut, svaret kastes, og x er uendret. Programmet kjører videre og gir feil svar uten å si fra.

✏️Eksempel 4: En full sjanger A-oppgave med kjede og kombinasjon

Dette er en oppgave på eksamensnivå. Hva skriver programmet ut? Spor det linje for linje før du leser løsningen.

poeng = 55 timer = 30 if poeng >= 60 and timer >= 20:
    print("bestatt")
elif poeng >= 50 or timer >= 40:
    print("konte")
else:
    print("stryk")
if timer >= 20:
    print("nok timer")

Spor grenene i rekkefølge, og hold de to if-setningene fra hverandre.

StegBetingelseRegnestykkeVerdiKjøres?
1poeng >= 60 and timer >= 20False and TrueFalsenei
2poeng >= 50 or timer >= 40True or FalseTrueja
3elsenei
4timer >= 20 (ny if)30 >= 20Trueja

Steg 1 er verdt et blikk: venstre side er usann, og da spiller det ingen rolle at høyre side er sann — and krever begge.
Steg 4 er en selvstendig if. Den hører ikke til kjeden over, og kjøres derfor uansett hvilken gren som traff.
Utskrift:
konte nok timer
Slik ville sensor sett på det: to poeng ligger i denne oppgaven, ett for hver

utskriftslinje. En kandidat som svarer bare konte, har forstått kjeden men oversett at siste if står for seg selv — og får uttelling for det første.

📝Oppgave 6
Eksamensnivå, sjanger A

Hva skriver programmet ut?

tall = 12 if tall % 2 == 0 and tall > 10:
    print("stort partall")
elif tall % 2 == 0:
    print("partall")
else:
    print("oddetall")

📝Oppgave 7
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig, med linjeskift.

a = 5 b = 10 if a > b:
    print("A")
elif a == 5:
    print("B")
elif b > a:
    print("C")
else:
    print("D")
if a < b and not a == b:
    print("E")

📝Oppgave 8
Eksamensnivå, sjanger I

En hyttebooking gir rabatt til alle som er 67 år eller eldre. Utvikleren har skrevet:

alder = 67 if alder > 67:
    print("rabatt")
else:
    print("full pris")

a) Hva skriver programmet ut for verdien over?

b) Gi et konkret moteksempel som viser at programmet er galt, og forklar i én
setning hvorfor.

c) Rett feilen.

API- og konstruksjonsliste

Begrepsbank

Begrepsbanken er flashcard- og repetisjonsstoff — den gjentar det du nettopp har lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder kjernestoffet.

Betingelse

Et boolsk uttrykk som styrer om en blokk med kode skal kjøres. Betingelsen står mellom if (eller elif) og kolonet.

En betingelse er alltid et uttrykk med en verdi, ikke en handling. Derfor kan du regne den ut for seg selv, skrive den ut med print, eller lagre den i en variabel — noe som er en god teknikk når betingelsen blir lang.

Gren

En av de mulige veiene gjennom en if-elif-else-kjede. Hver gren har sin egen blokk med kode.

Ordet er nyttig når du sporer: «hvilken gren traff?» er alltid det første spørsmålet, og svaret er alltid nøyaktig én i en kjede.

Kant-tilfelle

Verdien som ligger nøyaktig på grensen i en betingelse: 18 når kravet er «minst
18», 67 når det er «67 eller eldre».

Kant-tilfeller er der nesten alle logiske feil viser seg, og de er derfor det sensor tester med. Vanen som lønner seg: når du har skrevet en betingelse med en grense i, sett inn grenseverdien og regn ut for hånd før du går videre. Det tar ti sekunder og fanger en hel feilklasse.

Å kortslutte en `or`

Når venstre side av en or er sann, er hele uttrykket sant uansett hva som står til høyre — og Python bryr seg da ikke om å regne ut høyre side i det hele tatt.
Det samme gjelder and når venstre side er usann.

For sporing betyr det at rekkefølgen kan spille en rolle. I praksis trenger du sjelden å tenke på det i IN1000, men det forklarer hvorfor et uttrykk kan gi svar selv når høyre side ville ha krasjet.

Repetisjon — de seks setningene som må sitte

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.

Skolesaga er en uavhengig læringsressurs og er ikke tilknyttet eller godkjent av Universitetet i Oslo. Dette er ikke offisielt studiemateriell. Les mer.