1 - introduksjon

Om kurset

I dette kurset har vi ikke pensumbok. Det er først og fremst fordi det ikke er skrevet noen norsk bok om pythonprogrammering og økonomi. Det finnes også veldig lite litteratur på engelsk.

I stedet er disse notatene på github pensum, i tillegg til DataCamp, som vi skal komme tilbake til.

Informasjon om arbeidskrav, forelesninger og innleveringer finner du enkelt her på github. Alle oppgaver på github er arbeidskrav, og i tillegg vil det komme et par mindre oppgaver som dekker pensum som ikke finnes på DataCamp.

Karakter settes ut fra et prosjekt dere lager, og en muntlig presentasjon av prosjektet. På presentasjonen kan dere også få programmeringsfaglige spørsmål fra pensum. Dere skal levere inn en prosjektskisse 22/10 og frist for innlevering av selve prosjektet er 3/12. Det vil komme mer beskjed om prosjektet senere, men det vil involvere at dere innhenter noe data som analyseres grafisk, helst knyttet til økonomifaget.

Hvorfor python?

R og python er to av de ledende programmeringsspråkene i dag. I motsetning til R er Python et “ordentlig” programmeringsspråk i den forstand at du kan skape objekter og klasser. R er et enklere språk med mindre muligheter når det gjelder programmering, men har til gjengjeld et langt større utvalg pakker innenfor statistikk og økonometri. For statistisk analyse er derfor R ofte foretrukket, men dersom du skal gjøre noe litt annet enn som tilbys i R-pakker, er det en fordel med et mer avansert programmeringsspråk som Python.

Python har mange fordeler. De viktigste er at det er:

  • Enkelt, intuitivt og lett å forstå
  • Det er svært effektvit om en bruker de rette pakkene (numpy, pandas)
  • Det er et “ekte” programmeringsspråk der man kan skape objekter og klasser (dette er ikke noe vi lærer om i dette kurset)
  • stort utvalg av pakker (dog betydelig færre enn R innenfor statistikk og økonometri).

Programmeringsspråk

Da de første datamaskinene kom på 40-tallet, måtte brukerne gi maskinene instruksjoner i form av maskinkode. Datamaskiner er binære og forstår kun to tegn; 1 og 0, det vil si “av” og “på”. Brukeren måtte derfor forklare maskinen hva den skulle gjøre ved å skrive ned problemet som en lang rekke enere og nuller. Det ble raskt klart at dette var en ekstremt krevende oppgave. Programmeringsspråk ble derfor funnet opp for at mennesker skulle kunne gi instruksjoner til datamaskiner på en forståelig måte.

Stort sett alle programmeringsspråk henter syntaksen fra engelsk. Koden oversettes så til maskinspråk, noe som kalles å “kompilere” (“compile” på engelsk). Datamaskinen kan så behandle den kompilerte maskinkoden.

Lav- og høynivåspråk

Programmeringsspråk deles inn i høynivå- og lavnivåspråk. Forskjellen på høy- og lavnivå er hvor mye støtte språket gir til brukeren. Slik støtte gjør det enklere å programmere, men er kostbart fordi det gir en mindre effektiv kode.

Lavnivåspråk er gir svært effektiv og rask kode, men er mer krevende og mindre intuitive å programmere. C++ er et lavnivåspråk. Eksemplet under skriver ut tallene 0 til og med 4:

Eksempel 1:

    for (int i = 0; i < 5; i++) {
      std::cout << i << "\n";
    }

Vi kan sammenligne dette med tilsvarende kode i Python, som er et høynivåspråk:

Eksempel 2:

for i in range(5):
    print(i)
0
1
2
3
4

Om du har åpnet denne filen i Jupyter notebook (se under for instruksjoner), kan du kjøre Pythonkoden ved å trykke SHIFT+ENTER.

Vi ser at Python-koden er langt enklere, og har en syntaks som ligner mer på vanlig engelsk. Generelt er Python et svært intuitivt språk som er enkelt å programmere i. Språket ble funnet opp av Guido van Rossum i 1989 og er i dag verdens mest populære programmeringsspråk rangert ut fra googlesøk.

Selv om Python er er et høynivåspråk, er det svært effektivt på grunn av et stort antall bibliotek hvor mye er skrevet direkte i C eller C++. Ett slik bibliotek heter “Numpy”, og har svært effektive metoder for matriseoperasjoner. “Pandas” er et svært effektivt bibliotek for databehandling, og “Statsmodels” er et kraftfullt verktøy for dataanalyse.

Innrykk og linjeskift

Én ting som gjør det enklere å programmere i Python enn andre språk kan du allerede se av det lille eksemplet over. De fleste språk bruker ulike typer parenteser for å markere at noe tilhører en bestemt operasjon. Operasjonen over er en løkke, og vi ser fra Eksempel 21 at C bruker {} for å markere hva som er en del av løkken. I Python markeres tilhørighet til løkken med innrykk. Vi ser i Eksempel 1 at print(i) tilhører løkken fordi denne setningen er rykket ett hakk inn.

Det har etterhvert etablert seg som god skikk og bruk innen programmering å ha et innrykk for kode som tilhører en operasjon. Vi ser det av Eksempel 1, der innholdet i løkken også er rykket inn. Forskjellen mellom C og Python er imidlertid at i C har hverken linjeskift eller innrykk noen som helst betydning for hvordan koden fungerer. Eksempel 1 kunne like gjerne vært skrevet på en linje som for (int i = 0; i < 5; i++) {std::cout << i << "\n";}, og det ville fungert like bra.

I Python markeres imidlertid linjeskift et skille mellom setninger, og innrykk markere hva som tilhører hva. Det gir en kode som er enklere å lese og mer intuitiv.

Komme igang med jupyter lab

For å lese dette dokumentet interaktivt må du åpne det i Jupyter. Jupyter gjør at du kan kjøre koden som ligger i dokumentene, og at du kan endre og skrive din egen kode. Undervisningen i dette kurset vil hovedsakelig gjøres i Jupyter. Før du kan kjøre dettei Jupyter, må du laste ned kursmateriellet fra Github.

Github er et av mange nettsteder som tilbyr “versjonskontroll” på git-platformen. Git er et åpen-kildekode-prosjekt som organiserer programmeringsprosjekt. I et typisk prosjekt er det flere personer som samarbeider og som kan endre koden. Git gjør det mulig å holde orden på hvem som endret hva når. Det gjør det også enkelt å gå tilbake til tidligere versjoner, og du kan “forke”, eller “gafle” på norsk, som vil si å lage en ny gren med en annen kode en hovedgrenen.

Forelesningsnotatene for dette kurset er altså lagret i et “repositorie” på github.com, eller “repo” som det ofte kalles. Du kan se filene i nettleseren her: https://github.com/espensirnes/notebooks. Du kan laste dem direkte ned derfra, men det er mye bedre å bruke git-verktøyet til å laste dem ned. Da kan du kjøre kodene i notatboken interaktivt. I “0 - installasjon og tips.ipynb” finner du de mest brukte git-kommandoene

Det finnes flere ulike måter å kjøre Jupyter på. Det kan kjøres lokalt på PC’en eller på nettet. Det enklester er å kjøre jupyter fra din lokale maskin. I installasjonsveiledningen i kapittel 0 står det hvordan du

  1. Installere python
  2. Installere git
  3. Hente kursmateriell fra Github
  4. Installereog kjøre Jupyter lab

Når du har gjort dette, kan du starte jupyter lab med kommandoen

jupyter lab

Nå bør det ha åpnet seg et nettleservindu med forelesningsnotatene som filer i navigasjonsfeltet til høyre. Eventuelt må du klikke deg inn på notebook-mappen. Du kan nå klikke på “1 - introduksjon.ipynb”, og en interaktiv versjon av denne filen vil åpne seg.

(UiT har også en nettbasert løsning her)

Test denne jupyter arbeidsboken

Du bør nå ha åpnet denne Jupyter arbeidsboken i jupyter lab, slik at den er interaktiv. Du kan nå prøve å trykke i cellen under og kjøre koden ved å trykke SHIFT+ENTER. Om ikke teksten “Hello World!” dukker opp under, så, gå gjennom prosedyren over én gang til.

print('Hallo verden!')
Hallo verden!

Legg merke til funksjonen print(). Den viser frem resultatet under cellen der den er brukt, og er en funksjon vi kommer til å bruke mye.

Den siste linjen vises alltid, så print har virkning i Jupyter når den ikke står i siste setning. Forsøk å skrive to linjer med ‘Hallo verden!’ med og uten printi forskjellige rekkefølger for å se dette. Det vil fra nå av forutsettes at du leser disse notatene interaktivt i Jupyter Lab eller Notebook.

print, i betydningen å skrive ut til skjermen, har vi forøvrig ikke noe godt norsk ord for, så dette vil heretter kalles for å printe.

DataCamp

Vi kommer i utstrakt grad til å bruke DataCamp i dette kurset. DataCamp er en plattform med nettleksjoner i programmering, med selvrettende øvelser. En del av pensum og obligatoriske øvelser i dette kurset vil hentes fra DataCamp.

Alternative måter å bruke Python på

Det finnes flere alternative måter å installere og jobbe med Python. Vi kommer som nevnt til å bruke Jupyter installert på lokal maskin, men senere i dette programmet vil det bli behov for andre verktøy enn Jupyter.

Den enkleste installasjonen er å kun installere selve Python-programmet direkte fra https://www.python.org/ og koden kjøres fra kommandolinje (bildet til høyre). Python startes med kommandoen “python”. På mac må man ofte legge til versjonsnummeret, for eksempel “python38” for versjon 3.8. Dette gir en interaktiv økt der pythonkoden kjøres hver gang du trykker ENTER.

Å bruke en såkalt “IDE” gir imidlertid langt mer fleksibilitet. En IDE er et program som hjelper deg å lage og redigere python-filer. Dersom du skal lage et mer omfattende program i Python er det hensiktsmessig å lage filer. Hver fil er en modul som du kan kalle opp dersom du arbeider i samme mappe. Det går for eksempel an å samle noen funksjoner du bruker mye i en fil, og så importere denne filen når du skriver kode i Jupyter.

Det finnes flere ulike alternativer for IDE’er, men et godt og gratis alternativ er Visual Studio Code. VS Code støtter også flere andre programmeringsspråk. Men, som nevnt, detter er ikke noe du trenger til dette kurset.

Språk

Python, som de fleste andre programmeringsspråk, er basert på engelsk språk. Det er naturlig, siden engelsk er det overlegent største andrespråket i verden og de fleste programmeringsspråk har blitt utviklet i USA (her er Python et unntak). Av samme grunn bør all kode i utgangspunktet skriver på engelsk. Kode bør kunne deles globalt, og da bør den skrives på et språk flest mulig forstår.

Men selv om koden er engelsk, så er ofte brukergrensesnittet på lokalt språk. Du har kanskje norsk som språk i nettleseren din men bortsett fra navnene i menyene er all kode på engelsk.

I dette kurset skal vi gjøre det på tilsvarende måte. All kode skal i hovedsak skrives på engelsk. Printing kan imidlertid gjøres på norsk, slik som dette:

#let us make a simple program
my_sentence="Her er det lov å skrive norsk, for dette skal ut til skjermen!"
print(my_sentence)
Her er det lov å skrive norsk, for dette skal ut til skjermen!

Legg merke til den første setningen i programmet, #let us make a simple program. Hash-tenget # først, angir at denne linjen ikke skal oppfattes som en del av programmet. Pyhon overser dermed denne setningen. Denne funksjonen finnes, slik at vi kan dokumentere koden. Det vil si at vi skriver inn i koden hva som skjer.

Program blir ofte veldig fort veldig komplekse og uoversiktlige. Uten noen forklaring blir det fort vanskelig eller uoverkommelig for andre å forstå hva du har tenkt. Da blir det veldig vanskelig for andre å komme inn eller ta over prosjektet ditt. Det er også enklere for deg selv å gå tilbake og lese din egen kode, om du har vært flink å dokumentere den med kommentarer.

Gode programmeringsvaner

For å gjøre koden så godt leselig som mulig for andre, er det noen prinsipper som bør følges. Det er lite hensiktsmessig å gå detaljert inn på disse nå, før vi har lært litt mer, men vi tar med de generelle prinsippene som Tim Peters har laget, som du kan kikke tilbake på etterhvert som du lærer mer:

  1. Pent er bedre enn stygt.
  2. Eksplisitt er bedre enn implisitt.
  3. Enkelt er bedre enn komplekst.
  4. Komplekst er bedre enn komplisert.
  5. Flat er bedre enn nøstet.
  6. Luftig er bedre enn tett.
  7. Leselighet betyr noe.
  8. Spesialtifeller er ikke spesielle nok til å bryte regelene. Selv om praktiske hensyn slår renhet.
  9. Feil bør aldri passere i det stille, med mindre de er eksplisitt dempet.
  10. Når du møter tvilstilfeller, ikke fall for fristelsen å gjette.
  11. Det bør være én og helst bare én åpenbar måte å gjøre det på, selv om den måten kanskje ikke er åpenbar umiddelbart for de som ikke er nederelendere
  12. Nå er bedre aldri, selv om aldri ofte er bedre enn akkurat nå.
  13. Om implementeringen er vanskelig å forstå, så er det en dårlig idé.
  14. Om implementeringen er lett å forstå, så er det en god idé.
  15. namespaces er en fantastisk idé, – la oss gjøre mer av det!

Variabler

Variablene i Python kan være ulike objekter som i alle andre programmeringsspråk, og typen objekt defineres av hva du setter variabelen til. Det er vanlig å definere stort sett alle variabler med små bokstaver i Python. Kun unntaksvis brukes store bokstaver.

Du kan ikke bruke mellomrom i variabelnavn. Det vil oppfattes som flere ulike navn. For eksempel er number_of_apples tillatt men ikke “number of apples”. Vi bruker også kun engelske bokstaver, selv om norske fungerer. aintail_æpla kan altså brukes, men anbefales ikke.

bool (Sann/Usann)

Den enkleste variabelen i Python er den binære typen “bool”. Den kan ta to verdier, True eller False (sant eller usant). Denne variabelen brukes mest i sammenhenger der vi skal teste om et vilkår er oppfylt eller ikke. Da bruker vi if-setninger, som vi skal komme tilbake til.

Vi kan sjekke hvilken type en variabel er med funksjonen type(). Under får vi bekreftet apple_is_tasty er en boolsk variabel.

Eksempel 3:

#bool
apple_is_tasty=True
type(apple_is_tasty)
bool

Legg merke til hva som skjer her: Første linje er bare en kommentar, som nevnt i forrige kapittel. I andre linjer setter vi variabelen apple_is_tasty lik verdien True. Det er på denne måten vi definerer variabler i Python. Når vi har satt en variable på denne måten, bestemmer det hvilken type variabel det er.

Det er ikke alltid at variabelen settes rett før vi skal bruke den. Er det et stort program kan variabelen ha vært satt på en helt annen plass i programmet. I så fall er det nyttig å vise hvilken type variabel apple_is_tasty representerer. Siden den er satt til verdien True (sant), er det en bool.

Når vi kjører et kodefelt i Jupyter, får vi resultatet av den siste setningen skrevet ut til skjermen, etter kodefeltet. Om du har kjørt koden, vil du se at det står boolder. Det er fordi funksjonen type() står i siste linje, og den returnerer hvilken type apple_is_tasty er.

int (heltall)

int representerer hele tall i Python. Under ser vi at Python tolker 8 som et heltall:

Eksempel 4:

# integer:
number_of_apples = 8
type(number_of_apples)
int

Vi kan konvertere int til bool og bool til int ved å bruke disse som funksjoner slik som dette:

Eksempel 5:

type(int(apple_is_tasty))
int
type(bool(0))
bool

Legger merke til at i python så tilsvarer 1 True og 0 tilsvarer False, slik at

Eksempel 6:

20*False
0
20*True
20

float (desimaltall)

Regning gjøres vanligvis med desimaltall, eller “floating point” som det kalles av på fagspråket. I python heter derfor denne variabeltypen float.

Om for eksempel 11 skal tolkes som et heltall, gir vi beskjed til Python om at det er et desimaltall ved å skrive det med én desimal. Alle programmeringsspråk, inkludert Python, bruker punktum som desimaltegn.

Eksempel 7:

# floating point (float):
apple_price = 11.0
type(apple_price)
float

Navnet “floating point”, eller flyttall på norsk, kommer av at alle flyttall har eksakt like mange siffer, men desimaltegnet kan flyttes slik at float kan representere et svært stort spenn av verdier. Det største flyttallet er én med 308 nuller etter. Desimaltegnet flyttes enkelt fordi at float egentlig er på “vitenskapelig form” (se under), selv om det ofte vises som vanlig tall. For eksempel så kan vi skrive tallet 102 på vitenskapelig form, men Python spytter det ut på et format vi enklere kan forstå

Eksempel 8:

insane_apple_price = 1.02e+2
print(insane_apple_price)
102.0

Vitenskapelig form 1.02e+2 er en kombinasjon av et heltall (1), desimaler (.02) og hvilken potens av 10 tallet skal multipliseres med (e+2).

1.02e+2 betyr altså at \(1.02\) skal multipliseres med \(10^{2}=100\).

1.02e+2 betyr dermed \(1.02\cdot 10^{2}=102\). På samme kan \(0.0102\) skrives 1.02e-2, eller \(1.02\cdot 10^{-2}=102\).

Legg også merke til at funksjonen print()er brukt her. Det er ofte bedre å printe eksplisitt med printfunksjonen. Dersom det du ønsker å se ikke står sist i koden er det også nødvendig å bruke print().

Her er et eksemple med et lite flyttall:

Eksempel 9:

really_cheap_apple_price = 1.02e-2
print(really_cheap_apple_price)
0.0102

Når vi skriver ut resultatet får vi det altså ut som 102.0 eller 0.0102 i stedet for det vitenskapelige flyttallformatet. Det er fordi Python skjønner at 1.02e+2 og 1.02e-2 ikke ser så pent ut for oss. Python formaterer derfor tallet til et mer lesbart format før det skrives ut.

Det er enkelt å regne med både float og int:

Eksempel 10:

total = apple_price*number_of_apples
print(total)
88.0

Heldigvis spiller det liten rolle om noe er int eller float når du skal regne. I de fleste andre programmeringsspråk får du et nytt heltall når du deleret heltall på et annet. I Python gir dette et desimaltall:

Eksempel 11:

number_of_persons = 5
apple_per_person  = number_of_apples/number_of_persons
print(apple_per_person)
1.6

Regning med float

For de fire regneartene fungerer float slik vi har lært på barneskolen:

Eksempel 12:

print(2+3)
print(2-3)
print(2*3)
print(2/3)
5
-1
6
0.6666666666666666

Ofte har vi imidlertid bruk for å opphøye et tall i et annet. Om vi for eksempel vil vite hva \(2\cdot2\cdot2\) er, så kan vi istedet skrive \(2^3\). Dette kalles en potens med 2 som grunntall og 3 som eksponent. I python utføres denne operasjonen med dobbelt gange-tegn **. Dette er ulikt endel andre programmeringsspråk, der cirkumfleks-symbolet ^ ofte brukes.

Slik regner du med potens i Python:

Eksempel 13:

2**3
8

str (tekst)

Tekst kalles “streng” på dataspråket, eller “string” på engelsk. Typen som representerer tekst heter derfor str. Vi forteller Python at dette er en tekst ved å sette anførselstegn rundt. Her er et eksempel på en streng:

Eksempel 14:

# string:
x="Dette er en streng (dvs tekst)"
type(x)
str

Det er enkelt å sette sammen string og andre variabler i Python. Det er flere måter å gjøre det på, men vi skal bruke en metode som er ganske ny i Python. Fra og med versjon 3.6 kom noe som kalles “f-strings” som gir oss en veldig enkel måte å blandet tekst og andre variabler. Her er et eksempel:

Eksempel 15:

print(f"Det er {apple_is_tasty} at jeg synes epler smaker godt.")
Det er True at jeg synes epler smaker godt.

Legg merke til f’en før det første anførselstegnet. Den angir at dette er en f-streng og at alt som er inne i klammeparenteser {} skal omformateres til string og tas med i teksten.

Et alternativ er å bruke +-tegnet. Det går nemlig an å summere tekst i Python:

Eksempel 16:

"Jeg "+"gikk "+"derfor "+"på "+"butikken "+"for "+"å "+"kjøpe"
'Jeg gikk derfor på butikken for å kjøpe'

Men det går ikke an å summere tekst og andre variabler, da skjønner ikke Python hva du ønsker å oppnå

Eksempel 17:

"Jeg gikk derfor på butikken for å kjøpe " + number_of_apples + " epler. "
TypeError: can only concatenate str (not "int") to str

Du må i så fall omformatere tallet number_of_apples til streng:

Eksempel 18:

"Jeg gikk derfor på butikken for å kjøpe " + str(number_of_apples) + " epler."

Derfor er det langt enklere å bruke f-strings. Dersom tekststrengen er for lang for én linje, kan du sette flere tekstrenger etter hverandre på hver sin linje, slik som dette:

Eksempel 19:

print(
    f"Det er {apple_is_tasty} at jeg synes epler smaker godt. \n"
    f"Jeg gikk derfor på butikken for å kjøpe {number_of_apples} epler. \n"
    f"Innehaveren gav meg en vanvittig pris. Hun skulle ha {insane_apple_price} kroner per eple. \n"
    f"Jeg fortalte henne at det var helt uaktuelt, og foreslo {really_cheap_apple_price} kroner. \n"
    f"Hun avslo, men vi ble til sist enig om {apple_price} kroner.\n"
    f"Jeg betalte hennet til sammen {apple_price*number_of_apples} kroner og dro hjem. \n\n"
    f"På veien traff jeg {number_of_persons} venner. Jeg hadde ikke noe annet valg enn å dele eplene mine med dem. \n"
    f"Det ble {number_of_apples/number_of_persons} epler per person.\n"
)

Merk at setningene må stå inne i en parentes, for eksempel som argument i en funksjon som over, for at Python skal forstå at de skal settes sammen til én setning. Legg også merke til \npå slutten av hver delsetning. Denne indikerer at det skal være linjeskift etter hver delsetning.

Anførselstegn for strenger

Det finnes tre forskjellige typer tegn for å markere at noe er tekst i Python. Disse er apostrof ', anførselstegn " og trippel anførselstegn """. Rollen til de to første typene er å enkelt kunne bruke anførselstegn inne i teksten:

Eksempel 20:

print( "Jeg gikk derfor på butikken for å 'kjøpe' epler.")
print( 'Jeg gikk derfor på butikken for å "kjøpe" epler.')

Trippel anførselstegn """ brukes når du vil ha tekst over flere linjer, for eksempel

Eksempel 21:

s=f"""Det er {apple_is_tasty} at jeg synes epler smaker godt.
Jeg gikk derfor på butikken for å kjøpe {number_of_apples} epler.
Innehaveren gav meg en vanvittig pris. Hun skulle ha {insane_apple_price} kroner per eple.
Jeg fortalte henne at det var helt uaktuelt, og foreslo {really_cheap_apple_price} kroner.
Hun avslo, men vi ble til sist enige om {apple_price} kroner.
Jeg betalte hennet til sammen {apple_price*number_of_apples} kroner og dro hjem.

På veien traff jeg {number_of_persons} venner. Jeg hadde ikke noe annet valg enn å dele eplene mine med dem.
Det ble {number_of_apples/number_of_persons} epler per person."""
print(s)

Alternativt kan du sette hver setning på linje etterhverandre med egne enkel anførselstegn, som i Eksempel 21, men da må alle setningene befinne seg inne i en parentes.

Oppgaver

Oppgave 1

Bruk koden i Eksempel 19, men fjern \n og se hva som skjer

print(
    f"Det er {apple_is_tasty} at jeg synes epler smaker godt. "
    f"Jeg gikk derfor på butikken for å kjøpe {number_of_apples} epler. "
    f"Innehaveren gav meg en vanvittig pris. Hun skulle ha {insane_apple_price} kroner per eple. "
    f"Jeg fortalte henne at det var helt uaktuelt, og foreslo {really_cheap_apple_price} kroner. "
    f"Hun avslo, men vi ble til sist enig om {apple_price} kroner."
    f"Jeg betalte hennet til sammen {apple_price*number_of_apples} kroner og dro hjem. "
    f"På veien traff jeg {number_of_persons} venner. Jeg hadde ikke noe annet valg enn å dele eplene mine med dem. "
    f"Det ble {number_of_apples/number_of_persons} epler per person."
)
Det er True at jeg synes epler smaker godt. Jeg gikk derfor på butikken for å kjøpe 8 epler. Innehaveren gav meg en vanvittig pris. Hun skulle ha 102.0 kroner per eple. Jeg fortalte henne at det var helt uaktuelt, og foreslo 0.0102 kroner. Hun avslo, men vi ble til sist enig om 11.0 kroner.Jeg betalte hennet til sammen 88.0 kroner og dro hjem. På veien traff jeg 5 venner. Jeg hadde ikke noe annet valg enn å dele eplene mine med dem. Det ble 1.6 epler per person.

Oppgave 2

Lag variabler som du putter inn i en historie som i Eksempel 21

short_story = "Dette er en kort historie"
f"Det er {len(short_story)<20} at det var en kort historie"
'Det er False at det var en kort historie'

Oppgave 3

  1. Hvilke variabler kan brukes sammen med multiplikasjonsoperatoren *? prøv for eksempel "hei"*2.0 og True*2.0
print(True+2)
print(5+2)
print(5.0+2)
print("hei"*2)
print("hei"*" og hå")
3
7
7.0
heihei
TypeError: can't multiply sequence by non-int of type 'str'
  1. Hvilke variabler kan brukes sammen med addisjonsoperatoren +?
print(True+2)
print(5+2)
print(5.0+2)
print("hei"+" og hå")
print("hei"+2)
3
7
7.0
hei og hå
TypeError: can only concatenate str (not "int") to str
  1. Hvilke variabler kan brukes sammen med divisjonsoperatoren /?
print(True/2)
print(5/2)
print(5.0/2)
print("hei"/2)
print("hei"/" og hå")
0.5
2.5
2.5
TypeError: unsupported operand type(s) for /: 'str' and 'int'
  1. Hvilke variabler kan brukes sammen med subtraksjonsoperatoren -?
print(True-2)
print(5-2)
print(5.0-2)
print("hei"-" og hå")
print("hei"-2)
-1
3
3.0
TypeError: unsupported operand type(s) for -: 'str' and 'str'

Oppgave 4

  1. Forsøk med prøving og feiling å finne det størst mulige float-tallet som ikke blir inf
1e+308
1e+308
  1. Forsøk med prøving og feiling å finne float-tallet nærmest null som ikke blir 0.0

Oppgave 5

  1. Hva er hensikten med en boolsk variabel i Python?

Å teste om noe er sannt eller usannt

  1. Hvordan kan du konvertere
    1. en boolsk verdi til en heltall verdi i Python?
    2. et heltall til en streng i Python?
    3. et flyttall til et heltall i Python?

print(int(True))
print(str(5))
print(int(2.3543351))
1
5
2
  1. Hvorfor bruker vi f-strings i Python, og hvordan bruker du dem for å kombinere tekst og variabler?

f-strings er nyttige fordi det gjør det svært enkelt å kombinere ulike variabeltyper med tekst, på en pen og oversiktlig måte, uten å trenge å konvertere variablene først.

var = 5
f"var er lik {var}"
'var er lik 5'
  1. Hvordan representerer du desimaltall i Python, og hva er spesielt med hvordan de lagres i minnet?

Desimaltall i Python er flyttall, som er en tallrekke med 16 tall og et desimaltegn (“.”) etterfulgt av “1e-xxx”/“1e+xxx”, som bestemmer hva tallet skal multipliseres med. xxx angir hvor mange ganger 10 skal opphøyes, så 1e-2 er for eksempel 0.01 og 2e+2 er 200.

print(1e-2)
print(1e+2)
0.01
100.0
  1. Hva betyr det å heve et tall til en potens, og hvordan utfører du denne operasjonen i Python?

Å heve et tall i en potens betyr å gange tallet med seg selv et angit antall ganger. Til dette brukes **. For eksempel er 10**2=10*10 og 100**0.5 = 10.

print(10**2)
print(100**0.5)
100
10.0

Oppgave 6

  1. Skriv en Python-kode som definerer variablene: name, age, og city med dine egne detaljer. Bruk deretter en f-string for å skrive en setning som kombinerer disse detaljene.
name = 'Kari'
age = 25
city = "Tromsø"

f"Dette er en historie om {name}. Hun er fra {city} og er {age} år" 
'Dette er en historie om Kari. Hun er fra Tromsø og er 25 år'
  1. Lag en kalkulator ved å definere to variabler xog yførst. Koden skal viser summen, differansen, produktet, forholdet og x i potens av y.
x = 5
y = 8.0

print(x+y)
print(x-y)
print(x*y)
print(x/y)
print(x**y)
13.0
-3.0
40.0
0.625
390625.0
  1. Bruk boolske verdier for å avgjøre om et tall er oddetall eller partall, og skriv ut resultatet for tallet 15.
number = 15

is_even = number/2 == int(number/2)

print(f"{number} er et {['oddetall', 'partall'][is_even]}")
15 er et oddetall
  1. Beskriv hva som vil skje hvis du forsøker å kjøre følgende kode: “Hello” + 5.
"Hello" + 5
TypeError: can only concatenate str (not "int") to str

Det går ikke an å kombinere tekst og heltall. Python forstår ikke hva du forsøker å gjøre da.

  1. Skriv en kode som definerer to variabler var_type og x. Du skal sette var_type til en datatype og x til en verdi, for eksempel slik som under. Koden skal konvertere x til datatypen angitt av var_type, og printe ut type og verdi før og etter konverering. Forsøkt så med ulike verdier for x og ulike datatyper i var_type.
var_type=int
x = 2.2


print(f"type: {type(x)}, verdi: {x}")
x = var_type(x)
print(f"type: {type(x)}, verdi: {x}")
type: <class 'float'>, verdi: 2.2
type: <class 'int'>, verdi: 2
var_type=str
x = 5.354616351


print(f"type: {type(x)}, verdi: {x}")
x = var_type(x)
print(f"type: {type(x)}, verdi: {x}")
type: <class 'float'>, verdi: 5.354616351
type: <class 'str'>, verdi: 5.354616351
var_type=float
x = 200


print(f"type: {type(x)}, verdi: {x}")
x = var_type(x)
print(f"type: {type(x)}, verdi: {x}")
type: <class 'int'>, verdi: 200
type: <class 'float'>, verdi: 200.0