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å.
løkkene i kap. 1.3, ryggraden i alt du gjør i faget.
De dukker opp to steder. I sjanger A — kodeforståelse («hva skriver dette programmet ut?») er en if-elif-else-kjede en fast kortsvarsfelle: hvilken gren slår til, og hva skjer med de andre? Og i alle kodeskrivingsoppgavene er betingelsen selve logikken — «tell dem som er over 18», «returner False hvis noen er negativ».
Ingen egen oppgave heter «betingelser», og likevel er de overalt. Derfor er de verdt en full økt: dette må sitte, som er bokas høyeste av tre nivåer.
De to fellene som koster mest, er å tro at flere grener kan slå til samtidig, og å bomme på kanten — > der det skulle vært >=.
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 FalseLø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.
Sammenligner to verdier og gir True hvis de er like:
print(3 == 3)
print(3 == 4)Utskrift:
True
FalseLegg 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.
Det motsatte av ==: gir True når verdiene er forskjellige.
print(3 != 4)
print("ja" != "ja")Utskrift:
True
FalseUtropstegnet leses som «ikke». a != b betyr «a er ikke lik b», og er nøyaktig det samme som not (a == b).
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
TrueForskjellen 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å.
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:
TrueLegg 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å.
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
FalseStø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.
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
FalseFø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 skriveralder < 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 på grensen. Er svaret riktig der, er resten som regel riktig også.
(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.
Kjører linjene under, men bare hvis betingelsen er sann:
alder = 20 if alder >= 18:
print("myndig")
print("ferdig")Utskrift:
myndig ferdigTre 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.
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 sluttBegge 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.
Feil innrykk er den vanligste årsaken til at et program ikke kjører i det hele tatt. To varianter:
- Glemt innrykk etter kolon. Python svarer med `IndentationError: expected an
indented block`.
- Blandet tabulator og mellomrom. To linjer kan se helt like ut på skjermen
og likevel ha ulikt innrykk, fordi den ene har tabulator og den andre mellomrom.
På eksamen skriver du kode i et tekstfelt uten hjelp fra en editor, og da er dette en reell risiko. Bruk konsekvent fire mellomrom, slik all kode i denne boka gjør, og la være å blande.
Det gode ved feilen: den krasjer med en gang, og den koster derfor sjelden mer enn den ene deloppgaven.
Kjører når betingelsen er usann:
alder = 15 if alder >= 18:
print("myndig")
else:
print("mindrearig")Utskrift:
mindrearigelse 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».
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:
COrdet 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`.
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 tiVerdien 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.
Dette er den mest testede fella i hele kapitlet, og den ser uskyldig ut.
x = 100 if x > 10:
print("over ti")
if x > 50:
print("over femti")Utskrift:
over ti over femtiSammenlign med elif-versjonen rett over, som bare skrev én linje. Samme verdi, samme betingelser, ulikt svar.
Regelen: bruk elif når alternativene utelukker hverandre og du vil ha
nøyaktig ett svar. Bruk to if-er når du vil at flere ting skal kunne slå til uavhengig av hverandre.
I en sporingsoppgave er dette det første du skal se etter: står det elif ellerif på linje to?
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.
| Gren | Betingelse | Verdi | Kjøres? |
|---|---|---|---|
if | 72 >= 90 | False | nei |
elif (1) | 72 >= 80 | False | nei |
elif (2) | 72 >= 60 | True | ja |
else | — | — | nei, en gren har allerede truffet |
Utskrift:
CHvorfor rekkefølgen avgjør: betingelsen poeng >= 60 er sann for 72, men dener også sann for 95. Sto den øverst, ville alle bestått-poengsummer fått
C, ogA-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.
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")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.
Sann bare når begge sidene er sanne:
alder = 20 print(alder >= 18 and alder < 67)
print(alder >= 18 and alder < 20)Utskrift:
True
FalseAndre 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å kortformen18 <= alder < 67, men den fulle formen er tydeligere å spore og er stilen i fagets egne løsningsforslag.
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
FalseMerk 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.
Snur en boolsk verdi:
er_ledig = False print(not er_ledig)Utskrift:
Truenot 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.
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.
Hva skriver programmet ut, og hva ville svaret vært hvis parentesen sto rundtor-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.
| Uttrykk | Leses som | Regnestykke | Verdi |
|---|---|---|---|
a or b and c | a or (b and c) | True or (False and True) er True or False | True |
(a or b) and c | som skrevet | (True or False) and True er True and True | True |
a and b or c | (a and b) or c | (True and False) or True er False or True | True |
Utskrift:
True
True
TrueAlle 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 girTrue, 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.
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?
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.
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 kjoreInnrykket viser hvem som hører til hvem: den indre else hører til den indreif, 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.
Tester om noe forekommer i noe annet, og gir True eller False:
navn = "Aleksander" print("eks" in navn)
print("ø" in navn)Utskrift:
True
FalsePå 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.
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.
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.
| Steg | Betingelse | Regnestykke | Verdi | Kjøres? |
|---|---|---|---|---|
| 1 | poeng >= 60 and timer >= 20 | False and True | False | nei |
| 2 | poeng >= 50 or timer >= 40 | True or False | True | ja |
| 3 | else | — | — | nei |
| 4 | timer >= 20 (ny if) | 30 >= 20 | True | ja |
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 timerSlik ville sensor sett på det: to poeng ligger i denne oppgaven, ett for hverutskriftslinje. 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.
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")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")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.
Fire feller står for nesten alle poengene som mistes på betingelser:
- if der det skulle stått elif. To selvstendige if-er kan begge slå
til; en elif-kjede kjører nøyaktig én gren. Les linje to nøye.
- Kantfeil. > der oppgaven sier «eller eldre», < der den sier «eller
yngre». Test alltid med verdien som ligger på grensen.
- Feil rekkefølge på grenene. Den mildeste betingelsen øverst spiser alle de
strengere. Sorter fra strengest til mildest.
- Halv sammenligning etter or. dag == "lordag" or "sondag" er ikke det du
tror. Skriv hele sammenligningen på begge sider.
Og én formfeil som stopper programmet umiddelbart: glemt kolon etter betingelsen, eller glemt innrykk på linjene under (#16).
Begrepsbank
Begrepsbanken er flashcard- og repetisjonsstoff — den gjentar det du nettopp har lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder kjernestoffet.
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.
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.
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.
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.
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.