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 programmeringsemnet ved Institutt for informatikk, UiO. Undervisningen foregår i Python. Eksamen er en 4-timers skriftlig digital eksamen i Inspera på 100 poeng. Tillatte hjelpemidler er «alle trykte og skrevne, ingen elektroniske».
Denne studieguiden er bygd på 11 høstsett med full oppgavetekst: H2014 og H2015 (INF1000-sett tilpasset IN1000), H2018–H2025 og ny/utsatt eksamen januar 2026. I tillegg bygger den på institusjonens løsningsforslag og sensorveiledninger for 2021–2026, tre delvis publiserte kontinuasjonseksamener og prøveeksamenene. Tallene i guiden er talt deloppgave for deloppgave i disse settene.
I de 51 eksamens-PDF-ene og de 35 offisielle løsningsforslagene i Python er det 0 treff på arv og super(), try/except, list comprehension, lambda, with open, sorted, enumerate, zip og tuple. Alt løses med klasser, lister, ordbøker, vanlige løkker og open/close. Arv og unntak kommer i IN1010.
Hver seksjon starter med «Slik testes dette på eksamen» og tall for hvor ofte hver oppgavetype har kommet. Deretter følger gjennomregnede eksempler i eksamensform, med nummererte steg og svar til slutt. Kodeeksemplene er skrevet for guiden og kjørt. Instansvariablene har _, slik sensorveiledningene krever.
Typen bestemmer hva + og * gjør, / gir alltid float, strenger kan indekseres men ikke endres, og tilordning til en parameter er lokal. Typekonvertering er med i 9 av 11 høstsett og i alle de 5 nyeste.
En variabel i Python er et navn som peker på en verdi, og typen følger verdien: int, float, str eller bool. Temaet gir sjelden egne poeng, men det avgjør svaret i mange av småoppgavene i Del 1 og 2. Ett tegn feil type, og hele deloppgaven er tapt.
Slik testes dette på eksamen. Typekonvertering finnes i 9 av 11 høstsett (H2014–K2026) og i 5 av de 5 nyeste (H2022–K2026). Del 1–2 i H2025 og K2026 var 9 av 9 «Hva skrives ut?» i begge settene med tall eller tekst som svar, og typekonvertering var med i begge. Strengbehandling står i 6 av 11 høstsett, boolske uttrykk i 7 av 11 (4 av de 5 nyeste), og en funksjon som gir parameteren en ny verdi (med tall eller tekst som argument), i 3 av 11. Som hovedtema gir temaet 2,9 % av poengene i snitt, men det trengs i 11 av 11 sett.
Skriv opp typen til hver operand før du regner. Da er reglene enkle: tall + tall adderer, streng + streng setter sammen, og streng * heltall gjentar strengen.
print("7" + "5") # 75
print(7 + 5) # 12
print(int("7") + 5) # 12
print(str(7) + "5") # 75
print(int("7" + "5") + 1) # 76
print("7" * 3) # 777
print(7 * 3) # 21
Blander du streng og tall med +, stopper programmet: "7" + 5 gir TypeError: can only concatenate str (not "int") to str. På en sporingsoppgave er svaret da en feilmelding, ikke et tall.
input() returnerer en streng, og det samme gjør hvert felt du får fra linje.split(). Skriver brukeren 4, gir koden under først strengen "44". Først etter int() blir det tallet 8. Sensorveiledningen for vår 2025 (oppgave 2a) ba sensor «se spesielt etter casting til int».
svar = input("Antall: ")
print(svar + svar) # 44
print(int(svar) + int(svar)) # 8
print(float("2.5") * 2) # 5.0
int("2.5") gir ValueError. Tekst med desimalpunkt går gjennom float().
print(14 / 7) # 2.0 / gir alltid float
print(14 // 4) # 3 heltallsdivisjon
print(14 % 4) # 2 resten
print(14 / 4) # 3.5
Når svaret skal skrives «slik det skrives ut», er 2 og 2.0 to ulike svar. % bruker du til å teste delelighet (t % 2 == 0) og til å dele opp sekunder i minutter og sekunder.
linje = "7;12;5"
deler = linje.split(";")
a = deler[0] * 2
b = int(deler[1]) // int(deler[2])
c = len(deler[1]) + b
print(a, b, c)
split(";") gir en liste med tre strenger: ["7", "12", "5"]. Ingen av dem er tall ennå.deler[0] * 2 er streng ganger heltall. Strengen gjentas, så a blir "77", ikke 14.int("12") // int("5") er heltallsdivisjon: 5 går 2 hele ganger i 12, så b = 2.len(deler[1]) teller tegnene i strengen "12", altså 2. Da blir c = 2 + 2 = 4.print med komma setter ett mellomrom mellom verdiene, og strengen skrives uten anførselstegn.| Uttrykk | Verdi | Type |
|---|---|---|
deler[0] | "7" | str |
a | "77" | str |
b | 2 | int |
len(deler[1]) | 2 | int |
c | 4 | int |
Svar: 77 2 4
sek = 250
m = sek // 60
s = sek % 60
snitt = sek / 5
print(m, s, snitt)
250 // 60: 60 går 4 hele ganger i 250, så m = 4.250 % 60: 250 − 4 · 60 = 10, så s = 10.250 / 5 går opp, men / gir alltid float: snitt = 50.0.print med komma setter ett mellomrom mellom verdiene.Svar: 4 10 50.0
Første tegn har indeks 0, og siste har indeks len(s) - 1 (eller -1). En streng kan ikke endres: by[0] = "b" gir TypeError: 'str' object does not support item assignment. Skal du lage en endret tekst, bygger du en ny streng i en løkke:
by = "Bergen"
print(by[0], by[-1], len(by)) # B n 6
baklengs = ""
for tegn in by:
baklengs = tegn + baklengs
print(baklengs) # negreB
Rekkefølgen i tegn + baklengs avgjør retningen. Med baklengs + tegn får du en kopi av ordet.
stor = grense > 5 regner ut sammenlikningen én gang og lagrer True eller False. Variabelen følger ikke med når grense endres senere:
grense = 7
stor = grense > 5
grense = 3
if stor and grense < 5:
grense = grense * 10
print(stor, grense) # True 30
En parameter er et lokalt navn som peker på det samme objektet som argumentet. Gir funksjonen parameteren en ny verdi med =, flyttes bare det lokale navnet. Variabelen hos den som kaller, peker fortsatt på det gamle objektet. Det gjelder alle typer, også lister. Forskjellen er at en liste kan endres gjennom parameteren, for eksempel med append eller liste[i] = …, og den endringen ser også den som kaller (se Lister og ordbøker). Tall og strenger kan ikke endres på den måten, så for dem er utfallet alltid at kalleren ser samme verdi som før.
def forkort(tekst, n):
n = n + 1
ny = ""
i = 0
while i < len(tekst):
ny = ny + tekst[i]
i = i + n
return ny
n = 2
kode = forkort("bibliotek", n)
print(kode, n)
n 3. Løkka tar derfor hvert tredje tegn, fra indeks 0.len("bibliotek") er 9, så indeksene som leses, er 0, 3 og 6. Ved i = 9 stopper løkka.n utenfor funksjonen er fortsatt 2. Tilordningen n = n + 1 inne i funksjonen flyttet bare det lokale navnet n.i | tekst[i] | ny |
|---|---|---|
| 0 | b | "b" |
| 3 | l | "bl" |
| 6 | t | "blt" |
| 9 | 9 < 9 er usant, løkka stopper | |
Svar: blt 2
Løsningsforslagene bruker print("Sum:", s) eller "Sum: " + str(s). Med komma legger print inn mellomrommet selv og tåler tall. Med + må du skrive mellomrommet og bruke str() selv. F-strenger og formatering med :.2f trengs ikke på eksamen.
Nøkkelformler
Vanlige feil
Eksamenstips
Laster...