Tilbake
1.1

1.1 Variabler, datatyper og uttrykk

Tall (`int`/`float`), tekst (`str`) og boolske verdier, aritmetiske uttrykk, og de kritiske typekonverteringene `int(...)`/`str(...)` — grunnlaget for den faste int-vs-str-fella i Oppgave 1.

40 min
8 oppgaver
Variablerdatatyperuttrykk
Din fremgang i kapitlet
0 / 8 oppgaver
Kapitlets plass i kurset

Forkunnskaper — sist du var her

Dette er bokas første faglige kapittel, og det kan leses uten forkunnskaper i programmering. Har du lest kap. 0.1, vet du allerede hvordan eksamen er bygget opp og hvorfor akkurat dette kapitlet er verdt tid.

Har du aldri skrevet en linje kode før, kan
Programmering med Python være en myk oppvarming, men det er ikke nødvendig: alt du trenger, står her.

Løkke 1 — Variabler: navn som holder på en verdi (~8 min)

Du skal skrive et program for en liten båtutleie. Du trenger å holde styr på hvor mange båter som er ute, hva utleien heter, og hva en dag koster. Tre opplysninger — og datamaskinen må kunne finne dem igjen.

Løsningen er å gi hver opplysning et navn. Et navn som holder på en verdi, heter en variabel, og det er den mest grunnleggende byggeklossen i all programmering.

Variabel og tilordning

En variabel er et navn som holder på en verdi. Du lager den ved å skrive navnet, et likhetstegn og verdien:

antall_baat = 3

Dette kalles en tilordning. Den leses fra høyre mot venstre: regn ut det som står til høyre, og la navnet til venstre peke på resultatet.

Likhetstegnet betyr altså ikke «er lik» slik det gjør i matematikken. Det betyr
«sett navnet til». Derfor er antall_baat = antall_baat + 1 en helt vanlig setning i Python, mens den ville vært meningsløs som en likning.

Fra da av kan du bruke navnet der du ellers ville skrevet verdien.

Datatype

Alle verdier i Python har en type, og typen bestemmer hva du kan gjøre med verdien. De fire typene du trenger i IN1000, er:

TypeHva det erEksempel
intheltall3, -17, 0
floatdesimaltall2.5, 249.50, -0.75
strtekst («streng»)"Fjordfart", "3"
boolsant eller usantTrue, False

Legg merke til 3 og "3" i tabellen. De ser like ut for et menneske, men de er to helt forskjellige verdier: det ene er et tall du kan regne med, det andre er et tegn du kan skrive ut. Å blande dem er den vanligste feilen i hele
Oppgave 1.

`int` — heltall

Heltall, uten desimaler: 3, 0, -17. Skrives uten anførselstegn og uten punktum.

Regner du med to heltall og bruker +, - eller *, får du et heltall tilbake. Divisjon er unntaket, og den ser vi på i løkke 2.

Størrelsen er ingen begrensning: Python håndterer vilkårlig store heltall uten at du trenger å tenke på det.

`float` — desimaltall

Tall med desimaler: 2.5, 249.50, -0.75. Desimalskilletegnet er punktum, ikke komma2,5 er ikke et tall i Python.

Et desimaltall skrives ut slik Python selv velger å skrive det, og det er ikke alltid slik du skrev det inn. Verdien 249.50 skrives ut som 249.5, fordi den avsluttende nullen ikke bærer informasjon. Det er verdt å huske i et auto-rettet svarfelt.

`str` — tekststreng

Tekst, skrevet mellom anførselstegn: "Fjordfart". Du kan bruke doble eller enkle anførselstegn — "hei" og 'hei' er samme verdi — men vær konsekvent.

En streng kan inneholde hva som helst, også sifre: "249" er en streng på tre tegn, ikke tallet 249.

Anførselstegnene er ikke en del av verdien. De forteller Python hvor teksten begynner og slutter, og de vises ikke når du skriver strengen ut.

`print(...)`

Skriver noe ut i terminalen. Du kan gi den flere verdier, skilt med komma:

navn = "Fjordfart" antall = 3 print(navn, antall)

Utskrift:

Fjordfart 3

Tre detaljer avgjør poeng i sjanger A. print setter ett mellomrom mellom hvert argument. Den avslutter med linjeskift, så neste print begynner på ny linje. Og den viser strenger uten anførselstegn.

✏️Eksempel 1: Tre variabler og én utskrift

Båtutleien heter Fjordfart, har tre båter ute og tar 249,50 kroner dagen. Lag en variabel for hver opplysning og skriv alle tre på én linje. Hva blir utskriften nøyaktig?

Tilordne først, skriv ut etterpå:

antall_baat = 3 navn = "Fjordfart" pris = 249.50 print(navn, antall_baat, pris)

Utskrift:

Fjordfart 3 249.5

To ting å merke seg i utskriften. Strengen "Fjordfart" vises uten
anførselstegn, og 249.50 er blitt 249.5 — den avsluttende nullen forsvinner fordi verdien er den samme. Skulle dette vært svart i et auto-rettet felt, måtte du skrevet nøyaktig Fjordfart 3 249.5, med ett mellomrom mellom hver del.

Legg også merke til variabelnavnet antall_baat. Norske ord er helt greie i kode, men æ, ø og å skal ikke stå i selve koden — derfor baat og ikke
båt.

📝Oppgave 1

(Innstegsoppgave — ren gjengivelse.) Se på disse tre linjene:

sted = "Slemdal" antall = 12 temperatur = 4.0

a) Hvilken type har hver av de tre verdiene?

b) Hva skriver print(sted, antall) ut, tegn for tegn?

c) Hva skriver print(temperatur) ut?

Kommentarer med `#`

Alt som står etter en firkanttast på en linje, hopper Python over. Det er en
kommentar, skrevet for mennesker:

pris = 249.50   # kroner per dag

På eksamen har kommentarer én bestemt verdi: de er stedet der du dokumenterer en antakelse når oppgaveteksten er uklar. «Antar at hvert navn er unikt» i en kommentar kan berge poeng.

Ellers gir kommentarer ingen uttelling, og fasitkoden i faget er nesten helt uten dem. Ikke bruk eksamenstid på å forklare kode som forklarer seg selv.

Navneregler for variabler

Et variabelnavn kan bestå av bokstaver, sifre og understrek, og må begynne med en bokstav eller understrek. Store og små bokstaver er forskjellige: Antall og
antall er to ulike navn.

Tre vaner som lønner seg i dette faget:

- Beskrivende navnantall_ledige framfor a. Sensor leser koden din.
- Norske ord er helt greit, og er faktisk stilen i fagets egne
løsningsforslag: hent_alder, travleste, antall_ledige.
- Ingen æ, ø eller å i koden. Skriv baat, stoerst, laan. Dette står
eksplisitt som en merknad i eksamenssettene.

Løkke 2 — Regning med tall (~10 min)

Nå skal båtutleien regne. Hvor mange båter er ledige? Hva koster fire dager? Hvor mange hele uker er 17 dager, og hvor mange dager blir til overs?

Python har sju regneoperatorer. Fire av dem er de du kjenner fra skolen, og tre av dem er verdt å studere nøye, fordi de er faste kilder til sjanger A-oppgaver.

`+`, `-` og `*` på tall

Addisjon, subtraksjon og multiplikasjon, akkurat som i matematikken:

plasser = 40 solgt = 27 print(plasser - solgt)
print(plasser * 2)

Utskrift:

13
80

Regner du med to heltall, får du et heltall tilbake. Er minst én av verdiene et desimaltall, blir svaret et desimaltall: 3 * 2.0 gir 6.0.

`/` — divisjon

Vanlig divisjon. Resultatet er alltid et desimaltall, også når det går opp:

print(9 / 3)

Utskrift:

3.0

Dette er verdt å feste seg ved i et auto-rettet svarfelt. Spørres det om verdien av 9 / 3, er svaret 3.0 og ikke 3. Skriver du 3, er svaret galt selv om du regnet riktig.

`//` — heltallsdivisjon

Divisjon der desimalene kastes bort, slik at du står igjen med et helt antall:

print(17 // 5)

Utskrift:

3

Tenk på det som «hvor mange hele ganger går fem opp i sytten». Svaret er tre, og
Python kaster resten.

Vær presis om hva som skjer med resten: // runder nedover, den runder ikke av til nærmeste. Både 17 // 5 og 19 // 5 gir 3.

`%` — rest

Resten etter en heltallsdivisjon:

print(17 % 5)

Utskrift:

2

Fem går tre hele ganger opp i sytten, og da er det to igjen. Operatoren leses
«sytten modulo fem».

// og % hører sammen som et par: den første gir antall hele, den andre gir det som blir til overs.

`**` — potens

Opphøyd i:

print(2 ** 10)

Utskrift:

1024

To opphøyd i ti. Legg merke til at dette er to stjerner etter hverandre — én stjerne er multiplikasjon, to er potens.

Regnerekkefølgen

Python regner i den rekkefølgen du lærte på skolen. Fra sterkest til svakest:

1. Parenteser
2. ** (potens)
3. *, /, //, %
4. +, -

Innenfor samme nivå regnes det fra venstre mot høyre — bortsett fra **, som regnes fra høyre mot venstre. Derfor er 2 ** 3 ** 2 det samme som
2 ** (3 ** 2), altså 2 ** 9.

Er du i tvil på eksamen, sett parenteser. De koster ingenting og fjerner all tvil for både deg og sensor.

✏️Eksempel 2: De fire divisjonene ved siden av hverandre

Regn ut 17 / 5, 17 // 5, 17 % 5 og 2 ** 10, og skriv resultatene på hver sin linje. Hva er den eksakte utskriften?

print(17 / 5)
print(17 // 5)
print(17 % 5)
print(2 ** 10)

Utskrift:

3.4
3
2
1024

Fire linjer, fire poenger å merke seg:

- 17 / 5 gir 3.4 — et desimaltall, fordi / alltid gir det.
- 17 // 5 gir 3 — et heltall, uten punktum.
- 17 % 5 gir 2 — det som ble til overs.
- 2 ** 10 gir 1024 — heltall inn, heltall ut.

Sammenhengen mellom de to midterste er verdt å skrive på notatarket: 5 ganger 3 er 15, og 15 pluss 2 er 17.

📝Oppgave 2
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig, med linjeskift slik terminalen viser den.

print(23 // 4)
print(23 % 4)
print(23 / 4)

✏️Eksempel 3: Når rekkefølgen avgjør svaret

Hva skriver disse fire linjene ut, og hvorfor er den siste den vanskeligste?

print(2 + 3 * 4)
print((2 + 3) * 4)
print(10 - 2 - 3)
print(2 ** 3 ** 2)

Utskrift:
14
20
5
512

Linje for linje:

- 2 + 3 * 4: gangetegnet er sterkest, så 3 * 4 regnes først. 2 + 12 er
14.
- (2 + 3) * 4: parentesen slår alt. 5 * 4 er 20.
- 10 - 2 - 3: samme nivå, så det regnes fra venstre. 8 - 3 er 5.
- 2 ** 3 ** 2: her snur regelen. Potens regnes fra høyre, så det er
2 ** (3 ** 2), altså 2 ** 9, som er 512.

Den siste er den eneste som overrasker. Hadde det vært venstre mot høyre, ville svaret vært 8 ** 2, altså 64. Det er et populært distraktoralternativ.

📝Oppgave 3
Eksamensnivå, sjanger A

La a = 7 og b = 2.

a) Hva blir a + b * 3?

b) Hva blir (a + b) * 3?

c) Hva blir a // b + a % b?

d) Hvilken av de tre verdiene er et desimaltall?

Løkke 3 — Tekst som ser ut som tall (~10 min)

Nå kommer kapitlets viktigste side, og fagets mest berømte felle.

Plusstegnet betyr ikke det samme for tekst som for tall. På to tall legger det sammen. På to strenger skjøter det dem sammen. Og siden "3" og 3 ser identiske ut på skjermen, er det lett å tro at de oppfører seg likt.

Det gjør de ikke, og forskjellen er testet i Oppgave 1 år etter år.

`+` på strenger — skjøting

Mellom to strenger skjøter + dem sammen til én, uten mellomrom:

print("Fjord" + "fart")

Utskrift:

Fjordfart

Det heter å konkatenere, altså å sette sammen ende mot ende. Vil du ha et mellomrom mellom, må du skrive det selv: "Fjord" + " " + "fart".

Og her er fella: "1" + "2" gir "12", ikke 3. Python legger ikke sammen — den skjøter.

`*` mellom streng og tall — gjentakelse

En streng ganget med et heltall gjentar strengen:

print("ha" * 3)

Utskrift:

hahaha

Dette brukes mest til å lage skillelinjer i utskrift: "-" * 20 gir tjue bindestreker etter hverandre.

Rekkefølgen spiller ingen rolle — 3 * "ha" gir det samme. Men to strenger kan ikke ganges med hverandre, og "ha" * 2.5 er ikke lov: antallet må være et heltall.

✏️Eksempel 4: Samme plusstegn, to helt ulike svar

Programmet under bruker plusstegnet to ganger på de samme to variablene. Hvorfor gir de to bruksmåtene forskjellig svar, og hva blir utskriften?

a = "3" b = "4" print(a + b, int(a) + int(b))

Se på anførselstegnene: både a og b er strenger.

- a + b skjøter derfor de to strengene: resultatet er strengen "34".
- int(a) + int(b) gjør først hver streng om til et tall, og legger så sammen
to tall: 3 + 4 er 7.

print skriver de to verdiene med ett mellomrom mellom:

Utskrift:

34 7

Dette er selve mønsteret fella dukker opp i på eksamen: to uttrykk ved siden av hverandre, der bare det ene har konverteringen. Svarer du 7 7 eller 34 34, har du behandlet begge likt — og det er nettopp det oppgaven tester.

📝Oppgave 4
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig.

kode = "20" suffiks = "24" print(kode + suffiks)
print(kode * 2)

📝Oppgave 5

(Innstegsoppgave — ren gjengivelse.) Du vil skrive ut en skillelinje av 20 bindestreker over en overskrift.

a) Hvilket uttrykk gir de 20 bindestrekene?

b) Hva skriver print("Sum" + ":" + " 12") ut?

c) Hvorfor kan du ikke skrive "Sum" + 12?

Løkke 4 — Å gjøre om mellom tekst og tall (~8 min)

Fella i forrige løkke har en enkel løsning: konverter. Python har tre små funksjoner som gjør en verdi om til en annen type, og de går igjen i nesten hver eneste eksamensbesvarelse.

De er også svaret på et problem du får igjen og igjen senere i faget: alt som kommer inn i programmet utenfra — fra brukeren, fra en fil — kommer inn som tekst.

`int(tekst)`

Gjør en verdi om til et heltall:

print(int("19") + 1)

Utskrift:

20

Strengen "19" blir tallet 19, og da virker plusstegnet som addisjon.

To presiseringer. int på et desimaltall kutter desimalene bort uten å runde av
int(3.9) gir 3. Og teksten må faktisk se ut som et heltall: int("nitten") og int("3.5") stopper begge med en feilmelding.

`float(tekst)`

Gjør en verdi om til et desimaltall:

print(float("12") + 3)

Utskrift:

15.0

Legg merke til utskriften: så snart én av verdiene er et desimaltall, blir svaret det også. 15.0, ikke 15.

float tåler både "12" og "12.5", mens int bare tåler den første.

`str(tall)`

Gjør en verdi om til tekst:

antall = 7 print("Vi har " + str(antall) + " ledige plasser")

Utskrift:

Vi har 7 ledige plasser

Uten str rundt tallet ville dette stoppet med en feilmelding, fordi + ikke kan skjøte tekst og tall.

Dette er standardmåten å bygge en utskriftstekst på i dette faget, og du kommer til å bruke den i hver eneste klasse du skriver senere i boka.

Data utenfra er alltid tekst

Alt som kommer inn i programmet ditt fra utsiden — det brukeren skriver i terminalen, og det som står i en tekstfil — kommer inn som tekst, uansett hvor mye det ligner et tall.

Leser du linjen Kari 24 fra en fil, er 24 strengen "24" og ikke tallet 24.
Skal du regne med den, må du selv skrive int(...) rundt.

Denne ene setningen er årsaken til en hel klasse av feil senere i faget, og du møter den igjen i kap. 7.1 om filinnlesing.

✏️Eksempel 5: Konverter tidlig, så virker resten

Et lite program har lest inn to verdier fra en fil, og begge er derfor tekst.
Prisen er 199 kroner og antallet er 2. Vis hva som skjer om du glemmer å konvertere, og hva som skjer om du husker det.

pris = "199" antall = "2" sum_tekst = pris + antall sum_tall = int(pris) + int(antall)
print(sum_tekst, sum_tall)

Utskrift:

1992 201

Den venstre verdien er strengen "199" skjøtet med strengen "2", altså
"1992" — et tall som ser skremmende plausibelt ut i en utskrift, og som er fullstendig meningsløst.

Den høyre er 199 + 2, altså 201.

Slik ville du skrevet det på eksamen: konverter én gang, øverst, og bruk
tallene etterpå.

pris = int("199")
antall = int("2")
print(pris + antall)

Utskrift:

201

Da finnes ikke fella lenger i programmet ditt.

📝Oppgave 6
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig.

tall = "12" print(tall + tall)
print(int(tall) + int(tall))
print(float(tall) + 3)

📝Oppgave 7
Eksamensnivå, sjanger…

Du har to variabler:

navn = "Ingrid" poeng = 42

a) Skriv én linje som skriver ut Ingrid har 42 poeng ved hjelp av skjøting
med +.

b) Hva ville skjedd om du droppet str(...) rundt tallet?

c) Skriv den samme utskriften uten skjøting i det hele tatt, ved å bruke
komma i print. Blir utskriften identisk?

Løkke 5 — Å oppdatere en variabel, og sant eller usant (~4 min)

To siste byggeklosser før kapitlet er ferdig. Den første bruker du i hver eneste løkke du skriver resten av faget; den andre er grunnlaget for alle betingelser i
kap. 1.2.

Å oppdatere en variabel

En variabel kan peke på en ny verdi som er regnet ut fra den gamle:

poeng = 0 poeng = poeng + 5 poeng = poeng + 5 print(poeng)

Utskrift:

10

Les hver linje fra høyre: regn ut poeng + 5 med den verdien poeng har , og la poeng peke på resultatet.

Dette mønsteret har et navn — akkumulator — og det er selve motoren i alt du skriver senere: å telle, å summere, å bygge opp et svar litt etter litt. Du møter det for alvor i kap. 1.3.

`+=` og de andre kortformene
poeng += 5 betyr nøyaktig det samme som poeng = poeng + 5:

poeng = 10 poeng += 2 print(poeng)

Utskrift:

12

Tilsvarende finnes -=, *= og /=.

Begge former er like gode på eksamen, og begge finnes i fagets løsningsforslag.
Velg én og vær konsekvent — i denne boka brukes += når vi teller, og den fulle formen når vi vil vise mekanikken tydelig.

Boolske verdier: `True` og `False`

Den fjerde typen, bool, har bare to mulige verdier: True (sant) og False
(usant).

er_ledig = True print(er_ledig)

Utskrift:

True

Legg merke til at de skrives med stor forbokstav og uten anførselstegn.
"True" med anførselstegn er en streng på fire tegn, ikke en boolsk verdi.

Boolske verdier er svaret enhver ja-eller-nei-test gir, og de styrer alle
if-setninger og while-løkker i faget. Selve testene møter du i
kap. 1.2.

Uttrykk

Et uttrykk er noe som har en verdi: 3, pris * 2, "Fjord" + "fart",
int(tall) + 1.

En setning er noe som gjør noe: en tilordning (x = 3) eller et kall
(print(x)).

Skillet er nyttig når du sporer kode: du regner ut uttrykk, og du utfører setninger. På høyre side av et likhetstegn står det alltid et uttrykk, og det skal regnes helt ferdig før navnet på venstre side får peke på noe.

✏️Eksempel 6: En full sjanger A-oppgave, sporet linje for linje

Dette er en oppgave på eksamensnivå. Hva skriver programmet ut? Spor den linje for linje før du leser løsningen.

antall = "6" pris = 45 antall = int(antall)
total = antall * pris total = total + 10 print(antall, total)
print(str(total) + " kr")

Før en tavle over variablene, én linje om gangen. En strek betyr at variabelen ikke finnes ennå.

LinjeHva som skjerantallpristotal
1antall = "6""6" (tekst)
2pris = 45"6"45
3antall = int(antall)6 (tall)45
4total = antall * pris645270
5total = total + 10645280

Linje 3 er den avgjørende: den skriver over antall med talversjonen av seg selv. Uten den ville linje 4 gjentatt strengen "6" førtifem ganger i stedet for å gange.
De to utskriftene leses hver for seg. print(antall, total) skriver de to verdiene med ett mellomrom mellom. print(str(total) + " kr") skjøter tallet, gjort om til tekst, sammen med enheten — og antall er ikke med på den linja.
Utskrift:
6 280
280 kr
Slik ville sensor sett på det: hele poenget i denne oppgaven ligger i linje
3 og i typen på hver verdi. En kandidat som svarer 270 i stedet for 280, har oversett linje 5, men har vist at hun forsto konverteringen — og får uttelling for det. En som svarer 666666 på siste linje, har gått i felle #3 og trodd at

antall fortsatt var tekst.

📝Oppgave 8
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig, med linjeskift slik terminalen viser den.

a = "5" b = 2 c = int(a) // b d = int(a) % b print(c, d)
print(a * b)
print(c + d, str(c) + str(d))

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.

Konkatenering

Å skjøte to strenger sammen ende mot ende med +. Resultatet er én ny streng.

Ordet er verdt å kjenne fordi det brukes i oppgavetekster og i fasiter. «Uttrykket konkatenerer de to strengene» betyr rett og slett at det setter dem sammen.

Ingen mellomrom legges til automatisk: vil du ha et, må du skjøte det inn selv.

Å konvertere en verdi

Å lage en ny verdi av en annen type ut fra en gammel: int("19"), str(42),
float("2.5").

Legg merke til ordet ny. Konverteringen endrer ikke den opprinnelige verdien; den lager en ny. Skriver du int(alder_tekst) uten å ta vare på svaret, har ingenting skjedd — du må skrive alder = int(alder_tekst).

Dette er en av de vanligste stille feilene hos nybegynnere, og den krasjer ikke.

Auto-rettet svarfelt

Et svarfelt i Inspera der maskinen sammenligner det du skrev, med fasitverdien tegn for tegn. Oppgave 1 rettes slik i de nyere settene.

Konsekvensen er at nesten riktig er galt: 7.0 for heltallet 7, 3 for
9 / 3 som gir 3.0, eller 'hei' med anførselstegn for teksten hei.

Boka gjengir derfor alle utskrifter nøyaktig slik terminalen viser dem — det er den formen svaret ditt skal ha.

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.