Tilbake
4.2

4.2 «Finn feilen» og konkret moteksempel

Å peke ut feilen i et program og — når det kreves — gi et **konkret moteksempel** (et sett argumenter som gir galt svar) framfor bare en verbal forklaring.

45 min
8 oppgaver
Finn feilenkonkret moteksempel
Din fremgang i kapitlet
0 / 8 oppgaver

Forkunnskaper — sist du var her

Kap. 4.1 — DRILL: kodesporing er det direkte grunnlaget: å finne en feil er å spore koden på data den ikke tåler. Under det ligger kap. 3.4 med de seks kodemønstrene, og
kap. 2.1 med flagg og tidlig retur.

De tre tingene du bruker mest her:

- sporingstavla: én kolonne per variabel, én rad per runde,
- kanttilfellene: tom samling, ett element, like verdier, ingen treff,
- de faste feilene: for tidlig return, glemt initialisering, av-med-én, og
en test som ikke slår til ved likhet.

Kort oppfrisket — hvordan en korrekt «er alle»-funksjon ser ut:

def alle_positive(tallene):
    for t in tallene:
        if t <= 0:
            return False return True

print(alle_positive([3, 5]), alle_positive([3, -1]), alle_positive([]))

Utskrift:

True False True

Kjenner du den riktige formen godt nok, ser du den gale med én gang.

Løkke 1 — Tre slags feil, og bare én av dem er vanskelig (~10 min)

Når et program ikke gjør det det skal, er det alltid én av tre ting. De to første forteller deg selv hva som er galt. Den tredje gjør ikke det, og det er den eksamen spør om.

Syntaksfeil

En feil i selve skrivemåten: glemt kolon etter if, ulike antall parenteser, feil innrykk.

Python nekter å kjøre programmet i det hele tatt, og sier hvilken linje den stoppet på. Meldingen heter SyntaxError eller IndentationError.

Dette er den greieste feilen som finnes: du får vite hvor den er før noe har skjedd. På eksamen skriver du på papir eller i et enkelt tekstfelt uten hjelp, så her hjelper bare øvelse — kolon etter if, for, while og def, og fire mellomrom som innrykk.

Kjøretidsfeil

Programmet starter, men stopper underveis. KeyError på en nøkkel som ikke finnes, IndexError på en plass utenfor lista, ZeroDivisionError på en tom samling, TypeError når du prøver å skjøte en tekst og et tall.

Feilmeldingens siste linje sier hva som gikk galt, og linjene over sier hvor.
Det er derfor du alltid leser nedenfra og opp.

Kjøretidsfeil er lette å oppdage så snart programmet kjøres — men på en hjelpemiddelfri eksamen kjører ingenting. Derfor er kanttilfellene noe du må prøve i hodet, ikke i maskinen.

Logisk feil

Programmet kjører uten en eneste feilmelding, og gir feil svar.

Dette er sjanger I. Det er den vanskeligste feiltypen, fordi ingenting varsler deg: koden ser rimelig ut, den gir et resultat, og resultatet er galt.

De logiske feilene i faget er påfallende få og faste: en test som ikke slår til ved likhet, en return som står inne i løkka i stedet for etter, en teller som aldri ble initialisert, en løkkegrense som er én for stor eller liten, og en
«ikke funnet»-verdi som kolliderer med ekte data.

Fem mønstre — og du finner dem alle ved å spore koden på kritiske inndata.

✏️Eksempel 1: Samme funksjon, tre slags feil

Tre studenter har skrevet hver sin versjon av en funksjon som skal telle hvor mange tall i en liste som er større enn null. Hvilken feiltype har hver av dem, og hvilken er farligst?

Versjon A

def tell_positive(tallene)
    antall = 0 for t in tallene:
        if t > 0:
            antall = antall + 1 return antall

Versjon B

def tell_positive(tallene):
    for t in tallene:
        if t > 0:
            antall = antall + 1 return antall

Versjon C

def tell_positive(tallene):
    antall = 0 for t in tallene:
        if t > 0:
            antall = antall + 1 return antall

Versjon A — syntaksfeil. Kolonet mangler etter def-linja. Python nekter å
kjøre programmet, og sier SyntaxError: invalid syntax med linjenummeret. Den er ufarlig fordi den stopper alt før noe rekker å bli galt.

Versjon B — kjøretidsfeil. Telleren er aldri initialisert. Programmet
stopper med UnboundLocalError: local variable 'antall' referenced before assignment.

Her er det verdt å stoppe opp ett øyeblikk. Fordi antall tilordnes inne i funksjonen, regner Python navnet som lokalt i hele kroppen — også på siste linje.
Derfor krasjer funksjonen på alle lister, også den tomme: return antall leser det samme lokale navnet, som aldri fikk noen verdi. Mekanikken er den samme som i feilkode #12, scope-forvirring.

Versjon C — logisk feil. Se innrykket på siste linje: return står inne i
løkka
. Funksjonen kjører, gir ingen feilmelding, og svarer alltid på grunnlag av bare det første tallet.

def tell_positive(tallene):
    antall = 0 for t in tallene:
        if t > 0:
            antall = antall + 1 return antall

print(tell_positive([5, 3, 8]))
print(tell_positive([-2, 4, 9]))
print(tell_positive([]))

Utskrift:

1
0
None

Tre svar, og alle tre er gale bortsett fra kanskje det siste. Lista [5, 3, 8] har tre positive tall, ikke ett. Lista [-2, 4, 9] har to, ikke null. Og den tomme lista gir None, fordi løkka aldri kjørte og return derfor aldri ble nådd — funksjonen har ingen retur etter løkka.

Versjon C er den farligste, og det er nettopp derfor eksamen spør om den. De
to andre finner maskinen for deg. Denne må du finne selv.

📝Oppgave 1

(Innstegsoppgave — ren gjengivelse.) For hver av de fire beskrivelsene under:
er det en syntaksfeil, en kjøretidsfeil eller en logisk feil?

a) Programmet skriver ut 12 der det skulle stått 3, uten noen
feilmelding.

b) Programmet stopper med KeyError: 'plast'.

c) Python nekter å kjøre programmet og peker på en if-linje uten kolon.

d) Funksjonen svarer riktig på alle lister med minst to elementer, men galt
på lister med ett.

Løkke 2 — Moteksempelet (~12 min)

Nå kommer selve formkravet. Når oppgaven sier «gi et eksempel som viser at funksjonen er feil», ber den om noe helt bestemt — og de fleste svarer på et annet spørsmål enn det som ble stilt.

Moteksempel
Ett konkret kall, med konkrete verdier, og det gale utfallet skrevet ut.

Formen er alltid den samme:

«storst(4, 4, 4) gir None, men skulle gitt 4

Tre deler: kallet, svaret funksjonen faktisk gir, og svaret den skulle gitt. Alle tre må være med.

En forklaring i ord — «funksjonen håndterer ikke like verdier» — er ikke et moteksempel. Den kan gjerne stå i tillegg, som en setning etterpå. Men kallet er det sensor krysser av for.

📜Slik finner du et moteksempel — fire steg
Steg 1 — Les hva funksjonen skal gjøre. Skriv den ene setningen ned. Uten
den vet du ikke hva som er galt.

Steg 2 — Prøv kanttilfellene, i denne rekkefølgen. Tom samling. Ett element.
To like verdier. Ingen treff. En verdi som ligger nøyaktig på en grense. Det er her feilene bor, og det er sjelden nødvendig å lete lenger.

Steg 3 — Spor koden på det ene tilfellet. Bruk tavla fra
kap. 4.1. Ikke gjett hva som skjer — regn det ut.

Steg 4 — Skriv de tre delene. Kallet, det gale svaret, det riktige svaret.

Og et viktig valg i steg 2: moteksempelet må treffe feilen. Har en finn-beste-funksjon glemt å oppdatere beste_antall, svarer den likevel riktig på data der den største verdien står sist. Velger du de dataene, har du bevist ingenting.

Kritisk inndata

De fem tilfellene du alltid prøver først, fordi det er der koden ryker:

1. Tom samling[], {}, "". Løkker tåler den; indeksering og divisjon
gjør det ikke.
2. Ett element — avslører løkker som forutsetter minst to, for eksempel når
man sammenligner naboer.
3. Like verdier — avslører tester som bruker > der >= trengs.
4. Ingen treff — avslører manglende «ikke funnet»-håndtering.
5. En verdi på grensen — avslører av-med-én og kantfeil.

Lista er kort nok til å huskes, og den dekker praktisk talt alle sjanger
I-oppgavene i arkivet. Bruk den også på din egen kode i Oppgave 3 og 4.

✏️Eksempel 2: Fra mistanke til moteksempel

En student skal skrive storst(a, b, c) som returnerer den største av tre tall.
Hun leverer:

def storst(a, b, c):
    if a > b and a > c:
        return a if b > a and b > c:
        return b if c > a and c > b:
        return c

Finn feilen, gi et moteksempel, og rett funksjonen.

Steg 1 — Hva skal den gjøre? Returnere den største av tre tall. For tre like
tall skal den returnere det tallet.

Steg 2 — Kanttilfellene. Tre like verdier er punkt 3 på lista, og her ser
det umiddelbart mistenkelig ut: alle tre testene bruker >, som er usann ved likhet.

Steg 3 — Spor på storst(4, 4, 4).

TestUtregningUtfall
a > b and a > c4 > 4 and 4 > 4usann
b > a and b > c4 > 4 and 4 > 4usann
c > a and c > b4 > 4 and 4 > 4usann

Ingen return kjøres, funksjonen faller ut nederst — og en funksjon uten return gir None.
Steg 4 — Moteksempelet:
> storst(4, 4, 4) gir None, men skulle gitt 4. Årsaken er at alle tre
> testene bruker >, som er usann når verdiene er like.

Merk at storst(4, 4, 1) også ville avslørt feilen, mens storst(9, 4, 1) ikke ville det — der er svaret riktig. Velg data der feilen faktisk slår ut.

Rettelsen. Å bytte alle > til >= virker, men er klønete. Den rene

løsningen er finn-beste-mønsteret, som ikke har problemet i det hele tatt:

def storst(a, b, c):
    beste = a if b > beste:
        beste = b if c > beste:
        beste = c return beste

print(storst(4, 4, 4), storst(2, 9, 5), storst(7, 7, 1))

Utskrift:

4 9 7
Slik ville sensor sett på det: moteksempelet er hovedpoenget og gir mest.

Forklaringen i én setning gir litt til. Rettelsen gir resten — og en rettelse som bytter mønster i stedet for å lappe, viser at du har forstått hvorfor feilen oppsto.

📝Oppgave 2
Eksamensnivå, sjanger I

En sykkelutleie vil vite om alle stativene er tomme. En student leverer:

def alle_tomme(stativene):
    for antall in stativene:
        if antall == 0:
            return True else:
            return False

a) Hva returnerer alle_tomme([0, 4, 0])?

b) Gi et konkret moteksempel og forklar i én setning hvorfor det går galt.

c) Rett feilen.

📝Oppgave 3
Eksamensnivå, sjanger I

En værstasjon lagrer temperaturer i en ordbok fra dag til grader. En student skriver en oppslagsfunksjon som skal si fra når dagen ikke finnes:

def hent_temperatur(maalinger, dag):
    if dag in maalinger:
        return maalinger[dag]
    return -1

a) Hva returnerer hent_temperatur({"mandag": -1}, "mandag")?

b) Hva returnerer hent_temperatur({"mandag": -1}, "fredag")?

c) Forklar hvorfor de to svarene er et problem, og foreslå en rettelse.

Løkke 3 — De fem faste feilene (~13 min)

Sjanger I henter feilene sine fra en kort liste. Kjenner du de fem mønstrene på synet, finner du feilen på under et minutt — og du unngår å lage den selv i
Oppgave 3 og 4.

Likhetsfella

En test som bruker > eller < der oppgaven mener «minst» eller «høyst».

Kjennetegnet er at funksjonen svarer riktig på alt unntatt verdier som ligger
nøyaktig på grensen. En aldersgrense på 18 som bruker alder > 18, utelukker
alle 18-åringer.

Moteksempelet skriver seg selv: bruk grenseverdien. Og les oppgaveteksten nøye — «over», «minst», «fra og med» og «under» betyr fire ulike ting.

For tidlig `return`

Begge svarene står inne i løkka, så det første elementet avgjør alt.

Kjennetegnet er lett å se: return True og return False i samme løkkekropp, ofte med if/else. Det svaret som krever at du har sett alle elementene, hører etter løkka.

Moteksempelet må ha et første element som gir «feil» svar — ellers svarer den gale funksjonen tilfeldigvis riktig.

Dette er feilkode #7, og den er den mest dokumenterte enkeltfeilen i fagets løsningsforslag.

Manglende initialisering

En teller eller en samling som brukes før den er opprettet.

To varianter. antall = antall + 1 uten antall = 0 før løkka gir NameError.
Og d[k] = d[k] + 1 uten if k not in d: d[k] = 0 gir KeyError — det er feilkode #14.

Kjennetegnet er at feilen slår til på første runde med data, men ikke på tom inndata. En funksjon som virker perfekt på den tomme lista og krasjer på alt annet, har nesten alltid denne feilen.

Av-med-én

En løkkegrense som er én for stor eller én for liten.

De tre variantene du møter: range(len(liste)) når koden inni bruker
liste[i + 1] — da ryker siste runde. range(1, len(liste)) når du egentlig ville hatt med det første elementet. Og liste[len(liste)], som aldri finnes.

Kjennetegnet er at funksjonen enten krasjer med IndexError på siste element, eller stille hopper over ett element i hver ende.

Moteksempelet er en kort liste — to eller tre elementer. Da er én for mye eller for lite lett å se. Dette er feilkode #5 og #6.

Sentinel-kollisjon

En «ikke funnet»-verdi som også kan være ekte data.

-1 for «ikke funnet» er trygt når svaret er en plass i en liste, siden en plass aldri er negativ. Det er ikke trygt når svaret er en temperatur, en saldo, en høydeforskjell eller et hvilket som helst tall som kan være negativt.

0 er enda farligere: null er gyldig i nesten alle sammenhenger.

None er det trygge valget, fordi det aldri kan forveksles med et tall. Det
er derfor finn-beste-mønsteret i boka starter med beste = None. Dette er feilkode #10.

✏️Eksempel 3: Full eksamensoppgave i sjanger I
Oppgave 2c (5 poeng). Et bibliotek vil finne den boka som er lånt ut flest
ganger. En student leverer:

def mest_utlant(utlan):
    beste = None beste_antall = 0 for tittel in utlan:
        if utlan[tittel] > beste_antall:
            beste = tittel return beste

a) Gi et konkret moteksempel som viser at funksjonen er feil.

b) Forklar i én setning hva som er galt.

c) Rett feilen.

a) Moteksempelet. Først må vi velge data der feilen slår ut. Siden
beste_antall aldri oppdateres, står den på 0 gjennom hele løkka, og enhver positiv verdi er større enn 0. Betingelsen slår derfor til på hver runde, og svaret blir den siste nøkkelen.

Det betyr at data der den største verdien står sist, ville gitt riktig svar ved et uhell. Moteksempelet må ha den største verdien et annet sted:

> mest_utlant({"atlas": 9, "kart": 1}) gir "kart", men skulle gitt
> "atlas".

b) Forklaringen. Funksjonen oppdaterer beste, men glemmer å oppdatere
beste_antall, slik at alle verdiene sammenlignes mot 0 i stedet for mot den beste hittil.

c) Rettelsen. Én linje, satt inn rett etter den som allerede står der:

def mest_utlant(utlan):
    beste = None beste_antall = 0 for tittel in utlan:
        if utlan[tittel] > beste_antall:
            beste = tittel beste_antall = utlan[tittel]
    return beste

print(mest_utlant({"atlas": 9, "kart": 1}))
print(mest_utlant({"kart": 1, "atlas": 9}))
print(mest_utlant({}))

Utskrift:

atlas atlas
None

De to første kallene har samme data i motsatt rekkefølge, og gir nå samme svar.
Det er nettopp den kontrollen som avslører feilen.

Slik ville sensor sett på det (5 p): moteksempelet med både galt og riktig
svar (2 p), forklaringen i én setning (1 p), rettelsen (2 p). Et moteksempel som ikke avslører feilen, gir ingenting — så bruk ti sekunder på å sjekke at det faktisk gjør det.

Og legg merke til kontrollen som ville forhindret hele feilen: teller
if-blokken like mange variabler som du satte før løkka? To før, én inni. Det er alt som skal til.

📝Oppgave 4
Eksamensnivå, sjanger I

En kantine gir studentrabatt til alle som er 25 år eller yngre. En student leverer:

def har_rabatt(alder):
    if alder < 25:
        return True return False

a) Gi et konkret moteksempel.

b) Rett feilen med minst mulig endring.

c) Hvilke fire ord i en oppgavetekst må du lese ekstra nøye for å unngå denne
feilen?

📝Oppgave 5
Eksamensnivå, sjanger I

En værstasjon vil regne ut hvor mye temperaturen endret seg fra én måling til den neste. En student leverer:

def endringer(maalinger):
    ny = []
    for i in range(len(maalinger)):
        ny.append(maalinger[i + 1] - maalinger[i])
    return ny

a) Hva skjer når funksjonen kalles med [4, 9, 7]?

b) Gi et konkret moteksempel og forklar i én setning hvorfor det går galt.

c) Rett feilen, og forklar hvor mange elementer resultatet skal ha.

📝Oppgave 6
Eksamensnivå, sjanger I

En brettspillklubb vil telle hvor mange ganger hvert spill er lånt ut. En student leverer:

def tell(spillene):
    antall = {}
    for spill in spillene:
        antall[spill] = antall[spill] + 1 return antall

a) Hva returnerer tell([])?

b) Hva skjer med tell(["sjakk"])?

c) Gi et moteksempel, forklar feilen, og rett den.

Løkke 4 — Flervalgsvarianten (~8 min)

Den andre formen sjanger I opptrer i, er et flervalg i Oppgave 1: du får en kodesnutt og fire påstander, og skal krysse av for dem som stemmer. Metoden er den samme, men to ting skiller.

Flervalg om feil i et program

Formen er: én kodesnutt, fire påstander, og beskjed om å krysse av for alle
som er riktige.

To ting skiller den fra fritekstvarianten. Det ene er at noen av påstandene er sanne — det er ikke gitt at koden er feil i det hele tatt, og en påstand av typen «funksjonen virker som beskrevet» kan godt være riktig.

Det andre er at blankt er feil. Er du usikker, krysser du av likevel — det koster ingenting å gjette, og et blankt felt gir garantert null.

Metoden er å prøve hver påstand mot ett konkret kall, akkurat som når du leter etter et moteksempel.

✏️Eksempel 4: Flervalget, påstand for påstand
Oppgave 1g (3 poeng). Se på funksjonen:

def snitt(tallene):
    total = 0 for t in tallene:
        total = total + t return total / len(tallene)

Kryss av for påstandene som er riktige.

a) Funksjonen gir riktig gjennomsnitt for [2, 4].

b) Funksjonen stopper med en feilmelding for den tomme lista.

c) Funksjonen returnerer et heltall når summen går opp i antallet.

d) Funksjonen endrer lista den får inn.

Prøv hver påstand mot ett konkret kall. Det tar under et minutt til sammen.

a) Riktig. Summen er 6, lengden er 2, og 6 / 2 er 3.0 — riktig
gjennomsnitt.

b) Riktig. Den tomme lista gir len(tallene) lik 0, og divisjon på null
stopper programmet med ZeroDivisionError. Det er feilkode #6, og det er den ekte feilen i funksjonen.

c) Galt. / gir alltid desimaltall. 6 / 2 er 3.0, ikke 3.

d) Galt. Funksjonen leser bare fra lista; ingen append og ingen tilordning
til tallene[i].

De riktige svarene er altså a og b — og legg merke til at a er riktig selv om funksjonen har en feil. Påstanden gjaldt bare det ene kallet.

def snitt(tallene):
    total = 0 for t in tallene:
        total = total + t return total / len(tallene)

print(snitt([2, 4]))
print(snitt([1, 2, 3]))

Utskrift:

3.0
2.0

Slik ville sensor sett på det (3 p): poeng per riktig avkryssing, ofte med
trekk for gale. Men blankt gir garantert null, så kryss av på det du tror.

Og merk hvordan påstand c tester noe helt annet enn de andre: den handler om
typen på svaret, ikke om logikken. Slike påstander er nesten alltid med, og
de fanger dem som ikke har lest kap. 4.1 nøye nok.

📝Oppgave 7
Eksamensnivå, sjanger I

Se på funksjonen:

def forste_over(tallene, grense):
    for i in range(len(tallene)):
        if tallene[i] > grense:
            return i return 0

Funksjonen skal returnere plassen til det første tallet som er større enn grensen, eller si fra hvis det ikke finnes noe slikt tall.

Hvilke av påstandene er riktige?

a) forste_over([3, 9, 5], 4) gir 1.

b) Funksjonen kan ikke skille «ingen tall over grensen» fra «det første
tallet er over grensen».

c) Funksjonen stopper med IndexError for den tomme lista.

d) return 0 burde vært return -1 eller return None.

📝Oppgave 8
Eksamensnivå, sjanger I

En frivilligsentral vil holde styr på hvor mange timer som er registrert til sammen. En student leverer:

total = 0

def registrer(timer):
    total = total + timer return total

registrer(3)
registrer(5)
print(total)

a) Hva skjer når programmet kjøres?

b) Forklar årsaken i én setning, og gi feilkoden.

c) Rett programmet uten å bruke globale variabler.

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.

Feilmeldingens siste linje

Den eneste linja du trenger fra en feilmelding. Den har formen
FeilType: forklaring, for eksempel KeyError: 'plast'.

Linjene over sier hvor feilen skjedde, nedenfra og opp: den nederste av dem er linja i din egen kode.

Skal du gjengi en feilmelding i en besvarelse, skriver du siste linje ordrett — ikke oversatt til norsk, og ikke omskrevet. Det er den formen sensor kjenner igjen.

Stum feil

En feil som verken stopper programmet eller gir en melding — den gir bare feil svar.

Alle de fem faste feilene i dette kapitlet er stumme i minst ett tilfelle: for tidlig return svarer alltid noe, likhetsfella svarer riktig på alt unntatt grenseverdien, og sentinel-kollisjonen ser helt normal ut til dataene blir negative.

Det er derfor sporing på kritiske inndata er den eneste metoden som virker. Du kan ikke vente på at noe skal si fra.

Å velge riktig moteksempel

Et moteksempel som ikke avslører feilen, er verdiløst — og det er lettere å lage enn man skulle tro.

En finn-beste-funksjon som glemmer å oppdatere beste_antall, svarer riktig når den største verdien står sist. En «alle»-funksjon med begge return inne i løkka, svarer riktig når det første elementet gir riktig svar.

Kontrollen tar ti sekunder: spor din egen kandidat i hodet, og se at svaret faktisk blir galt. Blir det riktig, velg andre data.

Å foreslå rettelsen

Rettelsen skal være minst mulig — én linje flyttet, ett tegn byttet, to linjer satt inn.

Unntaket er når feilen kommer av at studenten har valgt feil mønster. Da er den beste rettelsen å bytte hele mønsteret, slik storst ble skrevet om til finn-beste. Skriv i så fall én setning om hvorfor.

Ikke gjør begge deler samtidig. Å rette feilen og samtidig bytte variabelnavn og struktur gjør det vanskelig for sensor å se hva du mente — og uttellingen følger det sensor kan se.

«Er alle»-sjekkens rette form

Malen du sammenligner den innleverte koden med:

def alle_positive(tallene):
    for t in tallene:
        if t <= 0:
            return False return True

print(alle_positive([3, 5]), alle_positive([3, -1]))

Utskrift:

True False

Ett return inne i løkka, ett etter. Ser du to inne i samme løkke, er det feilkode #7 — hver gang.

Speilbildet gjelder for «finnes det noen»: return True inne, return False etter.

Kontrollen «to før, to inni»

Den enkleste kontrollen som finnes for finn-beste-mønsteret: teller if-blokken like mange variabler som du satte før løkka?

To startverdier før løkka — beste og beste_antall — krever to oppdateringer inne i if-en. Én av hver er den vanligste feilen i hele sjangeren.

Kontrollen tar fem sekunder, og den virker på din egen kode like godt som på andres. Bruk den hver gang du har skrevet en finn-beste-løkke i Oppgave 3 eller 4.

Når `-1` er trygt

Sentinel-verdien -1 for «ikke funnet» er trygg når svaret er en plass i en liste, fordi en plass aldri kan være negativ.

Den er utrygg for alt annet: temperaturer, saldoer, endringer og differanser kan alle være negative, og da kolliderer de to betydningene.

0 er aldri trygt, fordi null er gyldig i nesten enhver sammenheng.

Er du i tvil, bruk None. Det kan aldri forveksles med et tall, og det er grunnen til at boka bruker det i finn-beste-mønsteret.

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.