•Nestede løkker: for i in range(len(ytre)): for j in range(len(indre)):
•min()/max() med nøkkelparameter for å finne størst/minst
•all() og any() for å sjekke betingelser på hele lister
•enumerate(liste) gir både indeks og element
Vanlige feil å unngå
Variabler og datatyper
•Forveksle streng-konkatenering med talladdisjon. '1' + '2' gir '12', ikke 3.
•Glemme at int('1' + '2') først konkatenerer til '12' og SA konverterer til 12.
•Prove å legge sammen streng og tall uten konvertering: 'hei' + 5 gir TypeError.
•Glemme at boolske verdier skrives med stor forbokstav: True, ikke true.
Kontrollstrukturer
•Glemme at elif/else hoppes over når en tidligere betingelse er True. Bare EN gren i en if/elif/else-kjede kjører.
•Feil i while-løkker: glemme å oppdatere variabelen som kontrollerer lokken, noe som gir uendelig løkke.
•Forveksle range(5) (gir 0-4) med range(1, 5) (gir 1-4). range() inkluderer IKKE stoppverdien.
•Feil innrykk: kode som skal være inne i en løkke, men som er rykket ut (eller omvendt).
Funksjoner
•Forveksle print() og return. print() viser noe på skjermen, return sender verdien tilbake til koden som kalte funksjonen.
•Bruke en lokal variabel fra en funksjon utenfor funksjonen -- dette gir NameError.
•Glemme å lagre returverdien: superfunksjon(42) uten variabel foran gjør at verdien forsvinner.
•Blande str() + int uten konvertering: 'tekst' + 42 gir TypeError. Bruk str(42).
Lister og ordbøker
•Forveksle 'for k in ordbok' (gir nøklene) med 'for v in ordbok.values()' (gir verdiene).
•Prove å aksessere en nøkkel som ikke finnes: ordbok['x'] gir KeyError. Sjekk med 'if x in ordbok' først.
•Glemme å initialisere en tom liste/ordbok for du bruker den i en løkke.
•Blande listeindeks (heltall) med ordboknokkler (kan være strenger, tall osv.).
Filhåndtering
•Glemme strip() slik at linjeskift-tegn blir med i strengen.
•Glemme typekonvertering: deler fra split() er alltid strenger, bruk int() for tall.
•Bruke feil indeks etter split: husk at indeksering starter på 0.
•Glemme å lukke filen med close() (bruk gjerne with-blokk for sikkerhet).
Klasser og objekter
•Glemme self foran instansvariabler: 'alder = 5' lagrer IKKE verdien på objektet.
•Tro at p3 = p1 lager en kopi. Det lager en NY referanse til SAMME objekt.
•Forveksle hva __init__ gjør: den INITIALISERER objektet, den oppretter ikke klassen.
•Glemme self som første parameter i metodedefinisjoner.
Objektorientert design
•Glemme å opprette alle instansvariabler i __init__. ALLE variabler som brukes i andre metoder må initialiseres der.
•Prove å aksessere en instansvariabel i en annen klasse direkte (obj._variabel) i stedet for å bruke en get-metode.
•Glemme å lagre nyskapte objekter i ordboken/listen: serie = Serie(navn) uten self._serier[navn] = serie.
•Skrive feil på metodenavnene -- bruk NØYAKTIG de navnene oppgaven gir.
Feilhandtering og debugging
•Anta at kode alltid kjører uten feil. På eksamen er noen oppgaver designet for å gi feilmelding!
•Forveksle NameError (variabel ikke definert) med AttributeError (attributt ikke funnet på objekt).
•Glemme at TypeError også oppstår ved feil antall argumenter til en funksjon.
•Ikke sjekke om en nøkkel finnes i ordbok for oppslag -- bruk 'if nøkkel in ordbok' først.
Algoritmer og problemløsning
•Glemme kanttilfeller: tom liste, liste med ett element, ordbok uten den søkte nøkkelen.
•Bruke feil sammenligningsoperator: == (likhet) vs. = (tilordning), < vs. <=.
•Returnere for tidlig i en løkke: return inne i en for-løkke avslutter hele funksjonen, ikke bare iterasjonen.
•Endre en liste/ordbok mens du itererer over den -- dette kan gi uventede resultater.
Eksamenstips
Variabler og datatyper
•Del 1-oppgaver med typekonvertering kommer HVERT år. Spør operasjonene steg for steg og skriv ned mellomverdier.
•Når en variabel oppdateres (tall = tall + 2), bruk alltid GJELDENDE verdi på høyre side.
•Vær oppmerksom på parenteser: int(a + b) er ikke det samme som int(a) + int(b).
•Noen del 1-oppgaver ber deg FYLLE INN et uttrykk som gir et bestemt resultat (f.eks. 'skriv et logisk uttrykk slik at utskriften alltid blir ja'). Da finnes det ofte flere riktige svar -- velg det enkleste.
Kontrollstrukturer
•Lag en sporingstabell med kolonner for alle variabler. Oppdater verdiene linje for linje -- dette er den sikreste metoden på del 1.
•For nestede løkker: skriv opp ALLE kombinasjoner av den ytre og indre variabelen systematisk.
•Sjekk alltid om while-lokken faktisk terminerer. Spør om betingelsen NOEN gang blir False.
Funksjoner
•Les oppgaveteksten nøye -- den sier ofte 'funksjonen skal returnere' (bruk return) vs. 'funksjonen skal skrive ut' (bruk print).
•Du kan bruke funksjoner fra tidligere deloppgaver selv om du ikke har løst dem. Anta at de virker som beskrevet.
•Sjekk alltid om funksjonen skal håndtere tomme lister eller spesielle tilfeller.
Lister og ordbøker
•Ordbokoppgaver i del 1: spør verdiene steg for steg. Skriv opp hele ordboken etter hver linje.
•Del 3-oppgaver: les oppgaveteksten nøye for å finne ut om du skal returnere en liste, en ordbok, eller bare en verdi.
•Tellemonsteret (ordbok der nøkkel=element, verdi=antall) er ekstremt vanlig. Pugge dette mønsteret!
Filhåndtering
•Del 4-oppgaven gir alltid et eksempel på filformatet. Les dette NØYE og skriv opp indeksene for split()-resultatet.
•Filinnlesing kombineres alltid med klasser. Data fra filen lagres i self._instansvariabler.
•Noen oppgaver bruker underscore-prefiks (_les_fra_fil) for interne hjelpemetoder. Denne konvensjonen er viktig.
Klasser og objekter
•Del 2-flervalg: tegn opp objektene som bokser og referansene som piler. Spør hvilke self._variabler som finnes på hvert objekt.
•Når koden mangler 'self' foran en variabel i __init__, er det med vilje -- det betyr at verdien IKKE lagres på objektet.
•Referanseoppgaver: husk at tilordning til en variabel (p3 = noe_nytt) IKKE påvirker andre variabler som pekte på det gamle objektet.
Objektorientert design
•Les hele oppgave 4 for du begynner. Forstå sammenhengen mellom klassene for du skriver kode.
•Begynn med deloppgave a) og b) (konstruktorer) -- disse er lettest og gir sikre poeng.
•Du får poeng for riktig struktur selv om detaljene ikke er perfekte. Vis at du forstår prinsippene.
•Oppgaven sier eksplisitt at du kan bruke metoder fra tidligere deloppgaver uten å ha implementert dem.
Feilhandtering og debugging
•Når et flervalgsalternativ er 'Man får en feilmelding', sjekk nøye om alle variabler er definert og om typene passer.
•Instansvariabler uten self i __init__ er en BEVISST felle i del 2. Les koden ekstra nøye.
•Bruk sporingstabeller på papir for ALLE kodelesingoppgaver. Det tar litt tid, men gir sikre poeng.
Algoritmer og problemløsning
•Del 3: Les eksemplene fra oppgaveteksten og sjekk at løsningen din gir riktig svar for disse.
•Del 5 er vanskelig og gir få poeng. Prioriter del 4 (50 poeng) hvis du har dårlig tid.
•Selv en ufullstendig løsning gir delpoeng. Skriv sa mye du kan, og kommenter hva du hadde tenkt å gjøre.
•Bruk hjelpefunksjoner! Hvis du trenger å gjøre noe to ganger, skriv en egen funksjon for det.