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.
verdt 2–6 poeng. Den dukker opp i to former: som flervalg i Oppgave 1 («hvilke av påstandene under er riktige om dette programmet?») og som kort fritekst i
Oppgave 2 eller 3 («gi et eksempel på inndata der funksjonen svarer feil, og forklar hvorfor»).
Dette er ett av bokas to temaer på nivå kjenne — det laveste av tre; det andre er grensesnitt som begrep i kap. 5.2.
Sjangeren er ikke sikker på settet, og den er sjelden verdt mange poeng. Men den koster deg lite: metoden er den samme sporingen du allerede kan fra
kap. 4.1, snudd andre veien.
Til gjengjeld har den én ufravikelig formregel, og den er lett å bomme på:
sensor ber om et konkret moteksempel, ikke en forklaring. Skriver du «funksjonen
håndterer ikke like verdier», har du levert en halv besvarelse. Skriver du
«storst(4, 4, 4) gir None, men skulle gitt 4», har du levert en hel.
Nytten er dessuten større enn poengene: den samme sjekklista bruker du på din egen kode i Oppgave 3 og 4, der den er verdt langt mer.
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 TrueKjenner 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.
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.
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.
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.
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 antallVersjon B
def tell_positive(tallene):
for t in tallene:
if t > 0:
antall = antall + 1 return antallVersjon C
def tell_positive(tallene):
antall = 0 for t in tallene:
if t > 0:
antall = antall + 1 return antalldef-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
NoneTre 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.
(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.
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.
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.
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.
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 cFinn feilen, gi et moteksempel, og rett funksjonen.
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).
| Test | Utregning | Utfall |
|---|---|---|
a > b and a > c | 4 > 4 and 4 > 4 | usann |
b > a and b > c | 4 > 4 and 4 > 4 | usann |
c > a and c > b | 4 > 4 and 4 > 4 | usann |
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 7Slik 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.
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 Falsea) 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.
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 -1a) 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.
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.
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.
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.
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 brukerliste[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.
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.
Fire ting koster poeng i sjanger I, og bare den første handler om koden:
- Å svare med en forklaring i stedet for et moteksempel. «Funksjonen
håndterer ikke like verdier» er en halv besvarelse. Kallet, det gale svaret og det riktige svaret er en hel.
- Å velge data der feilen ikke slår ut. En ødelagt finn-beste svarer riktig
når den største verdien står sist. Prøv moteksempelet ditt i hodet før du skriver det ned.
- Å påstå at koden krasjer når den ikke gjør det. De fleste sjanger
I-oppgavene har logiske feil: programmet kjører fint og svarer galt. Skriv hva den faktisk returnerer.
- Å rette mer enn det som er galt. Rettelsen skal være minst mulig, eller —
når feilen kommer av feil mønster — hele mønsteret byttet ut. Ikke skriv om variabelnavn og struktur samtidig; det gjør det vanskelig for sensor å se hva du mente.
Og én ting til: det er lov å si at koden er riktig. Flervalgsvarianten har ofte med en påstand som stemmer.
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 bestea) Gi et konkret moteksempel som viser at funksjonen er feil.
b) Forklar i én setning hva som er galt.
c) Rett feilen.
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 å oppdaterebeste_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
NoneDe 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: tellerif-blokken like mange variabler som du satte før løkka? To før, én inni. Det er alt som skal til.
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 Falsea) 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?
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 nya) 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.
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 antalla) 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.
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.
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.0Slik 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.
Se på funksjonen:
def forste_over(tallene, grense):
for i in range(len(tallene)):
if tallene[i] > grense:
return i return 0Funksjonen 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.
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.
Begrepsbank
Begrepsbanken er flashcard- og repetisjonsstoff — den gjentar det du nettopp har lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder kjernestoffet.
Den eneste linja du trenger fra en feilmelding. Den har formenFeilType: 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.
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.
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.
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.
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 FalseEtt 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.
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.
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.
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.