Komplett pensumoversikt for introduksjon til objektorientert programmering ved UiO — med forklaringer, sentrale begreper, eksamenstips og vanlige fallgruver. Eksamensoptimalisert basert på tidligere eksamener.
IN1000 Introduksjon til objektorientert programmering er det første programmeringskurset ved Institutt for informatikk, UiO. Kurset undervises i Python og dekker variabler, kontrollstrukturer, funksjoner, lister, ordbøker, filhåndtering, klasser og objekter. Eksamen er en 4-timers skriftlig digital prøve i Inspera der alle trykte og skrevne hjelpemidler er tillatt, men ingen elektroniske.
Denne studieguiden er kalibrert mot 13 ekte eksamens- og prøveeksamenssett fra 2014 til 2024. Poengfordelingen har vært påfallende stabil:
self, innkapsling og grensesnitt.Like viktig er hva som ikke testes. I ingen av de 13 settene forekommer arv, super(), polymorfisme, abstrakte klasser, try/except, rekursjon, list comprehension, lambda, with open(...), csv-modulen eller sortering med egendefinert nøkkel. Bruker du tid på dette, bruker du tid på feil ting. Til gjengjeld går tre mønstre igjen i nesten hver eneste besvarelse: opptelling i ordbok, les-før-løkke-validering og delegering mellom klasser.
Dynamisk typing, de fire datatypene int/float/str/bool, typekonvertering med int() og str(), heltallsdivisjon, strenger som uforanderlige sekvenser og boolske uttrykk med kortslutning. Testes i Del 1 på hvert eneste eksamenssett.
Python er dynamisk typet: du deklarerer aldri typen til en variabel, den bestemmes av verdien du tilordner. De fire datatypene IN1000-eksamen faktisk tester er int (heltall), float (desimaltall), str (tekst) og bool (True/False).
En variabel er en referanse til et objekt i minnet. Skriver du a = 5, opprettes et heltallsobjekt med verdien 5, og a peker på det. Skriver du deretter a = a + 3, opprettes et nytt objekt med verdien 8, og a flyttes over dit. Det gamle objektet er urørt. Denne innsikten er den samme som forklarer hvorfor def dobbel(t): t = t * 2 ikke endrer kallerens variabel.
Nesten hvert eneste eksamenssett åpner med en oppgave der forskjellen på tekst og tall avgjør svaret. Nøkkelen er at + gjør forskjellige ting avhengig av typene:
print("3" + "4") # 34 (strenger settes sammen)
print(3 + 4) # 7 (tall adderes)
print(int("3") + int("4")) # 7
print(int("3" + "4") + 1) # 35 (parentesen forst: "34" -> 34 -> 35)
print("5" * 3) # 555 (streng gjentas)
print(5 * 3) # 15
Framgangsmåten er alltid: skriv opp typen til hver operand før du regner. Er begge strenger, blir det sammensetting. Er begge tall, blir det aritmetikk. Er de blandet, blir det TypeError — bortsett fra streng ganger heltall, som gjentar strengen.
De tre konverteringsfunksjonene du trenger:
int("12") # 12 tekst -> heltall
int("12.5") # ValueError! ma ga via float
float("12.5") # 12.5
str(12) # "12" tall -> tekst
Dette er en fast felle i sporingsoppgaver:
print(20 / 2) # 10.0 float, ALLTID
print(20 / 3) # 6.666666666666667
print(20 // 3) # 6 heltallsdivisjon, runder ned
print(20 % 3) # 2 resten
% brukes til å teste partall (if t % 2 == 0) og til å regne ut siffer. Legg merke til at / gir float selv når det går opp: 10.0, ikke 10. I en sporingsoppgave der svaret skal skrives «nøyaktig slik det skrives ut», er forskjellen på 10 og 10.0 hele poengsummen.
En streng oppfører seg som en sekvens av tegn og kan indekseres og snittes som en liste:
s = "IN1000"
print(s[0]) # I
print(s[-1]) # 0 (siste tegn)
print(len(s)) # 6
print(s[2:]) # 1000
print(s[:2]) # IN
print(s[1:3]) # N1 (fra og med 1, til men ikke med 3)
Den avgjørende forskjellen fra lister: strenger kan ikke endres. s[0] = "X" gir TypeError: 'str' object does not support item assignment. Skal du «endre» en streng, bygger du en ny:
def fjern_tegn(setning, tegnliste):
ny = ""
for tegn in setning:
if tegn not in tegnliste:
ny = ny + tegn
return ny
print(fjern_tegn("ha det fint", ["a", "e", "i", "o", "u"])) # h dt fnt
Metodene du realistisk trenger er strip() (fjerner mellomrom og linjeskift i endene) og split() (deler opp i en liste). Begge hører hjemme i filhåndteringen.
Et sammenlikningsuttrykk er en boolsk verdi. Derfor skriver du
def to_av_tre(en, to, tre):
antall = 0
if en:
antall += 1
if to:
antall += 1
if tre:
antall += 1
return antall == 2
og ikke if antall == 2: return True else: return False. Skriv også if gratis: framfor if gratis == True:.
and, or og not kortslutter: Python slutter å evaluere så snart svaret er avgjort. Det er ikke bare en optimalisering — det er noe du kan bruke aktivt:
while start < len(a) and a[start] == 0:
start += 1
Her sjekkes a[start] aldri når start har passert slutten av lista, fordi første del av and allerede er usann. Bytter du om de to testene, får du IndexError.
Hva skrives ut?
tekst1 = "1"
tekst2 = "2"
tekst3 = "3"
tall = int(tekst1 + tekst2) + int(tekst3)
print(tall)
Steg for steg: tekst1 + tekst2 er sammensetting av to strenger og gir "12". int("12") gir tallet 12. int("3") gir 3. Summen er 15. Hadde parentesen stått rundt int(tekst1) + int(tekst2), ville svaret vært 6.
Alt i Python er objekter, og alle variabler er referanser. Forskjellen mellom datatypene ligger i om objektet kan endres:
a = 5
b = a
b = b + 1
print(a, b) # 5 6 — tall er uforanderlige, b fikk et NYTT objekt
liste1 = [1, 2]
liste2 = liste1
liste2.append(3)
print(liste1) # [1, 2, 3] — samme objekt, endret pa stedet
int, float, str og bool er uforanderlige. Lister, ordbøker og dine egne objekter kan endres. Dette ene skillet forklarer tre eksamensfeller samtidig: hvorfor def dobbel(t): t = t * 2 ikke virker, hvorfor liste[i] = 0 inne i en funksjon likevel virker, og hvorfor k3 = k1 gir aliasing mellom to objekter.
print(3 == 3.0) # True — samme verdi
print("3" == 3) # False — ulik type, aldri like
print(True == 1) # True — bool er en spesialform av int
print(2 < 10) # True
print("2" < "10") # False! strenger sammenliknes tegn for tegn
Den siste linja er verdt å merke seg: "2" < "10" er usant fordi tegnet 2 kommer etter tegnet 1 i alfabetet. Leser du tall fra fil uten int() og sammenlikner dem, får du nettopp denne feilen — og ingen feilmelding.
navn = "Ida"
alder = 20
print("Navn:", navn, "Alder:", alder) # Navn: Ida Alder: 20
print("Navn: " + navn + ", alder " + str(alder))
print med komma setter automatisk inn ett mellomrom mellom argumentene og konverterer alt til streng underveis. Med + må du selv sørge for både mellomrom og str(). På sporingsoppgaver der du skal svare «nøyaktig de tegnene som skrives ut», er dette mellomrommet ofte forskjellen på rett og galt svar.
a = 5
b = a > 2
if a == 3 or b:
a += 10
print(a)
b blir True fordi 5 > 2. I if-testen er a == 3 usant, men or b er sant, så hele uttrykket er sant. a blir 15. Legg merke til at b er en boolsk variabel, ikke en sammenlikning som gjentas — verdien ble låst da linja kjørte.
Nøkkelformler
Vanlige feil
Eksamenstips
Laster...