Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Introduksjon til jupyter notebook og basic aritmetikk i Python

Jupyter notebook er et interaktivt miljø for å skrive og kjøre kode, lage dokumentasjon, og visualisere data. Det er spesielt populært innen dataanalyse, maskinlæring, og vitenskapelig forskning.

I denne introduksjonen vil vi bruke en versjon av jupyter notebook som kjører i nettleseren din (som heter jupyter lite), slik at du ikke trenger å installere noe på din egen maskin.

JuPyteR er et akronym som står for Julia, Python, og R, som er tre populære programmeringsspråk. Jupyter støtter mange forskjellige programmeringsspråk, men Python er det mest brukte.

Komme i gang

For å kjøre en celle, trykk Shift + Enter eller klikk på “Run”-knappen i verktøylinjen. I eksempelet under er det en enkel Python-kode som definerer en variabel x og skriver den ut.

x = 42
print(x)

Vi kan endre verdien av x og kjøre cellen på nytt for å se den oppdaterte verdien.

x = x + 1
print(x)

I python kan vi også utføre operasjoner på en variable ved å bruke +=, -=, *=, og /=. For eksempel, for å øke verdien av x med 1, kan vi skrive:

x += 1
print(x)

Oppgave

Forsøk å endre verdien av x i cellen under og kjør den på nytt for å se resultatet. Førsøk også å bruke ulike operasjoner som +=, -=, *=, og /=x og se hvordan verdien endres.

# Skriv løsning her
# x *= 2

Løkker

Programmering handler ofte om å utføre repeterende oppgaver. I Python kan vi bruke løkker for å gjøre dette. En for-løkke lar oss iterere over en sekvens av verdier, mens en while-løkke fortsetter å kjøre så lenge en betingelse er sann.

For å illustrere en for-løkke, kan vi bruke den til å skrive ut tallene fra 0 til 4:

for i in [0, 1, 2, 3, 4]:
    print(i)

Her itererer vi over en liste med tallene 0 til 4, og skriver ut hvert tall i listen. I python har vi også en innebygd funksjon som heter range(), som genererer en sekvens av tall. Vi kan bruke range(5) for å generere tallene fra 0 til 4:

for i in range(5):
    print(i)

range(start, stop, step) genererer tall fra start til stop - 1, med et trinn på step. Hvis start ikke er spesifisert, starter den på 0. Hvis step ikke er spesifisert, er det 1 som standard. For eksempel, range(1, 10, 2) genererer tallene 1, 3, 5, 7, og 9.

for i in range(1, 10, 2):
    print(i)

Prøv gjerne å endre argumentene i range() for å se hvordan det påvirker tallene som genereres.

Merk også at python bruker innrykk (indentation) for å definere blokker med kode. Alt som er innrykket under for-setningen, vil bli kjørt i hver iterasjon av løkken. Hvor mye innrykk som brukes er viktig så lenge du bruker like mye (2 mellomrom, 4 mellomrom, osv. eller tabulator(TAB)), men det vanligste er 4 mellomrom, og de fleste editorer (inkludert jupyter notebook) gjør TAB til 4 mellomrom automatisk.

Vi kan også oppdatere en variable inne i en løkke. For eksempel, for å doble verdien av x fem ganger, kan vi skrive:

x = 1
for i in range(5):
    x *= 2
print(x)

Du kan også prøve å flytte print-setningen inn i løkken for å se verdiene av x på hver iterasjon.

Veldig ofte har vi flere enn en variabel som vi ønsker å oppdatere i en løkke. For eksempel, for å generere Fibonacci-sekvensen, trenger vi to variabler for å holde styr på de to siste tallene i sekvensen. For eksempel hvis vi ønsker å doble verdien av x men sørge for at vi holder styr på den forige verdien av x, kan vi gjøre det slik:

x = 1
y = x  # Initialiser y med verdien av x før løkken starter (er dette nødvendig?) 
for i in range(5):
    y = x # Oppdater y med den nåværende verdien av x (har det noe å si om vi gjør dette før eller etter at vi oppdaterer x?)
    x *= 2
print(x, y)

Forsøk gjerne å endre på rekkefølgen av oppdateringene av x og y i løkken og se hvordan det påvirker resultatet. Du kan også prøve å flytte print-setningen inn i løkken for å se verdiene av x og y på hver iterasjon.

Oppgave - print de første 10 tallene i Fibonacci-sekvensen

Fibonacci-sekvensen er en serie av tall der hvert tall er summen av de to foregående tallene. Sekvensen starter vanligvis med 0 og 1. De første ti tallene i Fibonacci-sekvensen er: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Skriv en for-løkke som genererer og skriver ut de første ti tallene i Fibonacci-sekvensen.

Dobbelklikk her for hint

# Skriv løsning her

Dobbelklikk her for løsning

Oppgave - regn ut π/4\pi / 4

Lag et program som regner ut følgende sum:

S=n=0N(1)n2n+1=113+1517++(1)N2N+1S = \sum_{n=0}^{N} \frac{(-1)^n}{2n + 1} = 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \ldots + \frac{(-1)^N}{2N + 1}

for en gitt verdi av N. Prøv med forskjellige verdier av N og se hvordan summen konvergerer mot π4\frac{\pi}{4} når N blir stor.

# Skriv løsning her

Dobbelklikk for løsning

Lister

Noen ganger ønsker vi å lagre flere verdier i en enkelt variabel. I Python kan vi bruke lister for dette. En liste er en samling av elementer som kan være av forskjellige typer, inkludert tall, strenger, eller til og med andre lister.

x = [1, 2, 3]
print(x)

Vi kan også legge til elementer i en liste ved å bruke metoden append(). For eksempel, for å legge til tallet 4 i listen x, kan vi skrive:

x.append(4)
print(x)

Vi kan bruke lister til å lagre resultatene underveis i en løkke. For eksempel, for å lagre de 5 første toerpotensnene (2^0, 2^1, 2^2, 2^3, 2^4), kan vi gjøre følgende:

x = []
for i in range(10):
    x.append(2**i)
print(x)

Vi kan også akksessere elementer i en liste ved å bruke indeksering. Indekseringen starter på 0, så det første elementet i listen har indeks 0, det andre elementet har indeks 1, og så videre. For eksempel, for å få det tredje elementet i listen x, kan vi skrive:

print(x[2])  # Tredje element i listen (indeksering starter på 0)

Oppgave - Lag en liste med de første 10 Fibonacci-tallene

Skriv en for-løkke som genererer de første ti tallene i Fibonacci-sekvensen og lagrer dem i en liste. Kan du forenkle koden ved å bruke lister?

Dobbelklikk her for hint

# Skriv løsning her

Doobelklikk for løsning

List comprehensions

Dersom man ønsker å lage en liste basert på en eksisterende liste eller en sekvens av tall, kan man bruke list comprehensions. Dette er en kortfattet og effektiv måte å lage lister på. Her er et eksempel på en liste comprehension som lager en liste med kvadrater av tallene fra 1 til 5:

y = [x**2 for x in range(1, 6)]
print(y)

Dette er ofte mer effektivt og lesbart enn å bruke en for-løkke for å bygge opp listen. I en jupyter notebook kan vi bruke %%timeit for å måle hvor lang tid det tar å kjøre en celle. La oss sammenligne ytelsen til en liste comprehension med en for-løkke for å lage en liste med kvadrater av tallene fra 1 til 10 millioner:

%%timeit
x = [x**2 for x in range(1, 10_000_000)]
%%timeit
y = []
for i in range(1, 10_000_000):
    y.append(i**2)

Det var ikke veldig stor forskjell i dette tilfellet, men i andre situasjoner kan det være betydelig forskjell i ytelse, spesielt for større datasett. Vi kan også argumentere med at list comprehensions ofte er mer lesbare og uttrykksfulle enn tradisjonelle løkker.

Importere biblioteker

I mange tilfeller ønsker vi å bruke funksjonalitet som ikke er direkte innebygd i Python. For dette kan vi bruke biblioteker (libraries) som er samlinger av funksjoner og klasser som kan hjelpe oss med spesifikke oppgaver. Python har et stort standardbibliotek som inneholder mange nyttige moduler, og det finnes også mange tredjepartsbiblioteker som kan installeres for å utvide funksjonaliteten til Python. For å importere et bibliotek, bruker vi import-setningen. For eksempel, for å importere matematikbiblioteket math, kan vi skrive:

import math

For å se hvilke funksjoner og konstanter som er tilgjengelige i math-biblioteket, kan vi i jupyter notebook starte med å skrive navnet på biblioteket etterfulgt av en punktum (.) og deretter trykke Tab-tasten. Dette vil vise en liste over tilgjengelige funksjoner og konstanter i biblioteket.

# Forsøk å skrive math. etterfulgt av Tab-tasten for å se tilgjengelige funksjoner og konstanter

En annen veldig nyttig funksjonalitet i jupyter notebook er at vi kan bruke ? for å få hjelp om en funksjon eller et objekt. For eksempel, for å få hjelp om math.sqrt-funksjonen, kan vi skrive:

math.sqrt?

Dette vil vise dokumentasjonen for math.sqrt-funksjonen, inkludert en beskrivelse av hva den gjør, hvilke argumenter den tar, og hva den returnerer. Forsøk å se på dokumentasjonen for noen andre funksjoner i math-biblioteket ved å bruke ?.

# Skrive math.sqrt? for å se dokumentasjonen for funksjonen

Bonus

Python har mange “easter eggs” og morsomme funksjoner innebygd. En av dem er import this, som importerer “The Zen of Python”, en samling av prinsipper for å skrive god Python-kode. Prøv å kjøre import this i en celle for å se hva som skjer!

Lister for numeriske beregninger

Lister er veldig fleksible og kan inneholde elementer av forskjellige typer, inkludert tall, strenger og til og med andre lister. Dette gjør dem til et veldig fleksibelt verktøy for å lagre og manipulere data. For eksempel kan vi lage en liste som inneholder både tall og strenger:

x = [1, "to", 3.0] # Liste med heltall, streng og flyttall
print(x)

print(type(x))  # Sjekk typen til variabelen x
print(type(x[0]))  # Sjekk typen til det første elementet i listen
print(type(x[1]))  # Sjekk typen til det andre elementet i listen
print(type(x[2]))  # Sjekk typen til det tredje elementet i listen

Vi kan til og med lage lister som inneholder andre lister

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
nested_list = [x, y, z]
print(nested_list)

Når vi jobber med numeriske beregninger, kan det være mer effektivt å bruke numpy-arrays i stedet for lister. Numpy er et bibliotek for numeriske beregninger i Python som gir oss muligheten til å jobbe med store datasett på en effektiv måte. Numpy-arrays er optimalisert for numeriske operasjoner og kan utføre operasjoner på hele arrays samtidig, noe som gjør dem mye raskere enn lister for store datasett.

Numpy kan installeres ved å bruke et pakkehåndteringssystem som pip eller conda. For eksempel, for å installere numpy med pip, kan du kjøre følgende kommando i terminalen

pip install numpy

I jupyer lite kan du installere numpy ved å bruke følgende kommando i en celle:

%pip install numpy

Fortsett til 02_numpy_matplotlib.ipynb for å lære mer om numpy og hvordan du kan bruke det til numeriske beregninger i Python.