! pip install matplotlib --quiet
WARNING: There was an error checking the latest version of pip.
Arrayer og tabeller#
Lister, tupler og biblioteker#
I tillegg til de vanlige datatypene vi allerede har snakket om har Pyton også mulighet for å huske flere verdier en og samme variabeltype. Python har innebygget 3 forskjellige typer for dette, lister, tupler og dictionaries. Vi skal her kun se på den første typen:
# Deklarasjon av liste uten innhold
tomListe = []
# liste med floats
listeDesimaltall = [3.3, 4.2, -8.0, 1.6]
#liste med forskjellige datatyper
listeMix = ["Ole", 101, True, -4.89]
print(listeDesimaltall)
print(listeMix)
[3.3, 4.2, -8.0, 1.6]
['Ole', 101, True, -4.89]
Som dere ser av eksemplet kan en liste bestå av ingen, en eller flere elementer. Siden Python ikke er kresent på datatyper så kan en liste bestå av hvilken som helst av disse og til og med forskjellige datatyper i samme liste. Dette er ikke vanlig i andre programmeringsspråk. For å skrive ut ett element fra listen brukes skrivemåten minListe[posisjon]. Legg merke til at referansen til første element starter på 0 og ikke 1.
Det går også an å skrive ut deler av listen på en enkel måte. Grensene angis slik: minListe[a:b]. Dersom du ikke angir start eller slutt vil Python anta at du vil ha med alt fra begynnelsen eller alt frem til slutten av listen. Se følgende eksempel:
minListe = ["Ole", "Thomas", "Kari", "Ali", "Miriam", "Martine", "Jonas", "Vilde"]
print(minListe[2:4])
print(minListe[:3])
print(minListe[4:])
['Kari', 'Ali']
['Ole', 'Thomas', 'Kari']
['Miriam', 'Martine', 'Jonas', 'Vilde']
Det finnes mange funksjoner som hører til datatypen lister, og vi skal ikke gå igjennom alle sammen her. Men som eksempler på nyttige funksjoner skal vi se på hvordan man kan legge til og fjerne elementer, samt sortere lister. Se eksempelet under:
minListe = ["Ole", "Thomas", "Kari", "Ali", "Miriam", "Martine", "Jonas", "Vilde"]
print(minListe)
# Legger til element på slutten av listen
minListe.append("Hermann")
print(minListe)
# Fjerner et objekt fra listen
minListe.remove("Kari")
print(minListe)
# Fjerner element fra listen basert på ideks, og sparer i en variabel (popping)
navn = minListe.pop(1)
print(navn)
print(minListe)
# Sorterer listen alfabetisk
minListe.sort()
print(minListe)
['Ole', 'Thomas', 'Kari', 'Ali', 'Miriam', 'Martine', 'Jonas', 'Vilde']
['Ole', 'Thomas', 'Kari', 'Ali', 'Miriam', 'Martine', 'Jonas', 'Vilde', 'Hermann']
['Ole', 'Thomas', 'Ali', 'Miriam', 'Martine', 'Jonas', 'Vilde', 'Hermann']
Thomas
['Ole', 'Ali', 'Miriam', 'Martine', 'Jonas', 'Vilde', 'Hermann']
['Ali', 'Hermann', 'Jonas', 'Martine', 'Miriam', 'Ole', 'Vilde']
Append legger til et element på slutten av listen.
Remove trekker fra bestemte objekter i lista. Hvis flere elementer er likeså fjernes alle.
Pop henter ut et element fra listen og returnerer elementet slik at det kan for eksempel skrives ut eller legges i en annen variabel. Dersom pop kalles uten indeks (for eksempel: minListe.pop() ), vil den hente ut det siste elementet i listen.
Iterasjon av lister#
Å iterere en liste betyr å «bla igjennom lista», gjerne i en for-sløyfe. I mange kodespråk gjøres dette på den første måten som vist i eksempelet over ved at man lager en teller (index) som teller fra 0 og til antall elementer i listen, og henter ut elementene ved hjelp av denne indeksen.
En mer snedig måte å gjøre dette på er vist i den nederste metoden: Her skjønner pyton at den skal gå igjennom listen, men i stedet for å bruke en tallindeks, henter python automatisk hvert element in i sløyfevariablen direkte.
minListe = ["Ole", "Thomas", "Kari", "Ali", "Miriam", "Martine", "Jonas", "Vilde"]
# Iterasjon med index, len() gir lengden på lista
for index in range(len(minListe)):
print(minListe[index])
# for mellomrom i utskrift
print("")
# Iterasjon med elementmetode (snedig)
for element in minListe:
print(element)
Ole
Thomas
Kari
Ali
Miriam
Martine
Jonas
Vilde
Ole
Thomas
Kari
Ali
Miriam
Martine
Jonas
Vilde
Arrayer#
En array er en form for liste hvor alle elementene er av samme datatype. Et array kan være endimensjonalt, som en vanlig liste, men kan også ha flere dimensjoner. For eksempel vil en tabell kunne representeres ved hjelp av en 2-dimensjonal liste. Python har ikke denne datatypen innebygget, men slike finnes i mange standardbiblioteker vi kan benytte oss av. Et vanlig og bra bibliotek til matematikk heter numpy. Dette biblioteker inneholder også ferdigkompilerte rutiner skrevet i C som gjør at det kan gjøre beregninger med og behandle store datamengder på relativt kort tid.
Et array kan lages manuelt, og inneholde forskjellige datatyper akkurat som den innebygde typen liste i python. Men vi skal heller konsentrere oss om hvordan vi kan bruke disse til å lage funksjonstabeller og matematiske analyser
Funksjonen linspace lager en array hvor du kan bestemme start og sluttverdi, og hvor mange elementer du vil ha med i arrayet. Dette er nyttig når man for eksempel skal lage en tabell med x-verdier. Se på følgende eksempel.
import numpy as np
x_array = np.linspace(-2, 6, 9)
print(x_array)
[-2. -1. 0. 1. 2. 3. 4. 5. 6.]
Man kan lage slike linspaces (linear spaces) med så mange elementer du vil for bedre oppløsning under beregninger, plotting og så videre. Hvis jeg vil ha 50 x-verdier mellom -3 til +8 skriver jeg kommandoen slik:
import numpy as np
x_array = np.linspace(-3, 8, 50)
print(x_array)
[-3. -2.7755102 -2.55102041 -2.32653061 -2.10204082 -1.87755102
-1.65306122 -1.42857143 -1.20408163 -0.97959184 -0.75510204 -0.53061224
-0.30612245 -0.08163265 0.14285714 0.36734694 0.59183673 0.81632653
1.04081633 1.26530612 1.48979592 1.71428571 1.93877551 2.16326531
2.3877551 2.6122449 2.83673469 3.06122449 3.28571429 3.51020408
3.73469388 3.95918367 4.18367347 4.40816327 4.63265306 4.85714286
5.08163265 5.30612245 5.53061224 5.75510204 5.97959184 6.20408163
6.42857143 6.65306122 6.87755102 7.10204082 7.32653061 7.55102041
7.7755102 8. ]
Hvis jeg nå vil gjøre beregninger på x-tabellen min gjøres det superenkelt og superraskt ved hjelp av de vanlige regneartene i python. Hvis jeg vil ha en funksjonstabell over f-verdiene til funksjonen: $\( f(x) = x^2 - 4 \)$
import numpy as np
x = np.linspace(-3, 8, 50)
y = x**2 - 4
print(y)
[ 5. 3.70345689 2.50770512 1.41274469 0.41857559 -0.47480217
-1.26738859 -1.95918367 -2.55018742 -3.04039983 -3.42982091 -3.71845065
-3.90628905 -3.99333611 -3.97959184 -3.86505623 -3.64972928 -3.333611
-2.91670137 -2.39900042 -1.78050812 -1.06122449 -0.24114952 0.67971678
1.70137443 2.82382341 4.04706372 5.37109538 6.79591837 8.32153269
9.94793836 11.67513536 13.5031237 15.43190337 17.46147439 19.59183673
21.82299042 24.15493544 26.5876718 29.1211995 31.75551853 34.4906289
37.32653061 40.26322366 43.30070804 46.43898376 49.67805081 53.0179092
56.45855893 60. ]
Det er imidlertid en ting du ikke kan gjøre med arrays fra numpy-biblioteket, og det er å bruke matematikkfunksjoner fra andre biblioteker på arrays. Du kan for eksempel ikke bruke kvadratrot eller trigonometriske funksjoner fra math-biblioteket, da må du bruke de funksjonene som er inkludert i numpy slik:
import numpy as np
x = np.linspace(-3, 8, 50)
y = np.sin(x)
print(y)
[-0.14112001 -0.35796023 -0.55683643 -0.72776815 -0.86217727 -0.95331856
-0.99661815 -0.98990308 -0.93351033 -0.83026995 -0.68536298 -0.5060615
-0.30136363 -0.08154202 0.14237173 0.35914064 0.5578863 0.72863478
0.86281718 0.95369963 0.99672126 0.98972305 0.9330562 0.8295645
0.68444163 0.50497047 0.30015769 0.08028167 -0.14362322 -0.36032048
-0.55893528 -0.72950025 -0.86345571 -0.95407918 -0.99682278 -0.98954144
-0.93260058 -0.82885774 -0.68351918 -0.50387864 -0.29895126 -0.0790212
0.14487449 0.36149974 0.55998336 0.73036456 0.86409286 0.9544572
0.9969227 0.98935825]
Grunnen til dette er at math-biblioteket kun kan operere med et og ett element om gangen, mens numpy-biblioteket skjønner at operasjonen skal gjøres på hvert eneste elemen i arrayet for seg. (Dette kalles for elementvis operasjon)
Iterasjon av Arrays#
Iterasjon av arrays er helt likt som for lister. Følgende eksempel itererer et array som heter x, og regner riemannsummen under funksjonsverdien. Verdien til elementene hentes ut med x[i], der i er elementnummeret som telles opp i for-sløyfa:
minArray = np.linspace(-3, 3, 7)
for i in range(minArray.size):
print(minArray[i])
-3.0
-2.0
-1.0
0.0
1.0
2.0
3.0
Det går også an å bruke «elementmetoden» på arrays.
minArray = np.linspace(-3, 3, 7)
for element in minArray:
print(element)
-3.0
-2.0
-1.0
0.0
1.0
2.0
3.0
Plotting#
I forrige seksjon brukte vi print til å se på verdiene i listene og arrayene våre. Det går selvfølgelig an å plotte grafer fra disse tabellverdiene. Det finnes mange biblioteker som kan tilby dette, men vi skal konsentrere oss om funksjonen plot fra biblioteket matplotlib. Dette er et stort bibliotek med mange undergrupper – derfor skal vi ikke importere hele biblioteket, så legg merke til hvordan vi importerer her. (Mer om importmetoder lenger ned i dokumentet!)
For å lage et enkelt plot lager jeg en x og en y-tabell først, og sender disse som argumenter inn i plottefunksjonen. Her er også kode for å sette navn på aksene. Flere funksjoner i dette biblioteket kan du finne online. I dette eksempelet vil jeg plotte grafen til funksjonen $\( f(x)=-x^3-3x^2+2x-2 \)$
import matplotlib.pyplot as plt
import numpy as np
# Lager x-verditabell
x = np.linspace(-10, 10, 100)
y = -x**3-3*x**2+2*x-2
# Plotter y mot x og setter på aksenavn
plt.xlabel("x-akse")
plt.ylabel("y-akse")
plt.plot(x,y)
[<matplotlib.lines.Line2D at 0x1f1208d9a00>]

Funksjoner#
Funksjoner i programmering er ikke det helt samme som funksjoner i matematikk, men de har noen likheter. I programmering er funksjoner ferdiglagede kodesnutter som skal brukes flere ganger. Du har allerede brukt mange forskjellige funksjoner i de kodesnuttene som er beskrevet over i dokumentet.
I turtle-biblioteket var det f.eks funksjonen forward(), left(), right() som fikk skilpadden til å bevege seg. Du har mange ganger brukt den innebyggede funksjonen print() for å skrive verdier til konsoll. Vi har også sett på matematiske funksjoner, som sin() og sqrt() og i forrige seksjon så vi på funksjonen plot() som kunne skrive ut grafer. Du kan også lage dine egne funksjoner i python. Funksjoner kan ta såkalt input (en eller flere) og den kan returnere output (en eller flere), men de må ikke. Dette kalles parameteroverføring, og vi sier at en funksjon tar ingen, en eller flere parameter inn. Variabler som er laget inni en funksjon er såkalt «lokale», dvs de eksisterer kun inne i funksjonen. Man kan heller ikke endre på variabler fra «utsiden» inne i funksjoner. Dette er fordi en funksjon ikke skal lage krøll på dine variabler eller variabler i andre funksjoner.
Nedenfor er det 3 eksempler på funksjoner. Legg merke til at vi gjenbruker a og b som variabler, det er helt ok siden de kun eksisterer inne i hver sin funksjon.
# Funksjonsdefinisjoner skal stå øverst i pythonkoden ( i det minste før den kalles og kjøres )
# en funksjon uten argumenter (parametere) hverken input eller output
def funksjonUten():
print("Denne funksjonen skriver bare ut dette")
# en funksjon med 2 input og ingen output
def leggSammen(a,b):
print("Svaret er:",a,"+",b,"=", a+b)
# en funksjon med 2 input og en output
def multipliser(a,b):
svartekst = "Svaret er: "+str(a)+" * "+str(b)+" = "+str(a*b)
return svartekst
# Kaller funksjonene:
# første funksjone er bare en sekvens
funksjonUten()
# den andre funksjonen tar forskjellige parameter inn, men skriver ut svaret fra inne i funksjonen
leggSammen(2,5)
leggSammen(-3,2)
# den tredje funksjonen returnerer svaret slik at vi kan spare den i vår egen variabel
svar = multipliser(3,4)
print(svar)
# eller bruke den direkte som input i en annen funksjon (snedig)
print(multipliser(-5,6))
Denne funksjonen skriver bare ut dette
Svaret er: 2 + 5 = 7
Svaret er: -3 + 2 = -1
Svaret er: 3 * 4 = 12
Svaret er: -5 * 6 = -30
Hvordan bruke funksjoner i matematisk sammenheng#
import matplotlib.pyplot as plt
import numpy as np
# definerer funksjonene
def f(x):
return x**2-4
def g(x):
return -np.sin(x)
# Lager x-verditabell
x = np.linspace(-4, 4, 100)
# Plotter y mot x og setter på aksenavn
plt.xlabel("x-akse")
plt.ylabel("y-akse")
# siden funksjonen returnerer y-tabell kan jeg bruke funksjonskallet direkte i plot()
plt.plot(x,f(x))
plt.plot(x,g(x))
[<matplotlib.lines.Line2D at 0x1f12095e130>]

Biblioteker#
Python er et programmeringsspråk under utvikling, selv om struktur og basiskommandoer er uendret kan det hende at det kommer nye konvensjoner på hvordan ting skal gjøres. Derfor kan det hende at man i noen kodeeksempler ser at ting blir gjort på én måte, mens i andre eksempler en annen. I skrivende stund er Python i versjon 3, som kom i 2008. Likevel er det vanlig å finne eksempler som er skrevet i versjon 2.7. Disse eksemplene kjører fint i Python 3, men det hender at du vil få en advarsel under kjøring.
“Star imports”#
Det er spesielt en ting man skal legge merke til. Når det gjelder importering av biblioteker vil man nå, i de fleste utviklingsmiljøer (f. eks Spyder) få advarsel hvis man prøver å importere hele biblioteker uten å gi de et lokalt navn. Se eksempelet under:
from math import *
from numpy import *
svar = sin(2*pi)
print(svar)
-2.4492935982947064e-16
Her er bibliotekene math og numpy importert på den gamle måten med alle sine respektive funksjoner. Det betyr at hvis disse bibliotekene inneholder en funksjon eller en konstant med samme navn, så vet ikke Python hvilken som skal kjøres. Og begge disse matematikkbibliotekene inneholder hver sin utgave av funksjonen sin() og pi. I den 3. instruksen her, svar = sin(2*pi), velger sannsynligvis Python fra det biblioteket som ble importert først. Akkurat her har det ikke noe å si for resultatet, men det er ikke alltid sikkert.
Import-metoden#
En mye bedre måte å importere biblioteker på er å bruke denne metoden:
import math
import numpy
svar = math.sin(2*numpy.pi)
print(svar)
-2.4492935982947064e-16
Her blir bibliotekenes funksjoner importer under sitt eget navn. Når man da skal kalle funksjoner eller bruke konstanter fra bibliotekene så angir man dette med biblioteksnavnet som prefiks slik: biblioteksnavn.funksjonsnavn() eller konstantnavn. På denne måten kan vi importere biblioteker som inneholder funksjoner med samme navn uten at det blir problemer av det. I eksempelet over brukes sinusfunksjonen fra math, og konstanten pi fra numpy
Alias-metoden#
Man kan også importere biblioteker og gi de et lokalt alias. Denne metoden er ofte brukt for å lage forkortelser, eller hvis man skal importere et underbibliotek
import math as m
import numpy as np
svar = np.sin(2*m.pi)
print(svar)
-2.4492935982947064e-16
Her er bibliotekene math og numpy importert slik at de får de lokale aliasene m og np. Man kan selv velge hvilket alias som skal brukes lokalt, men det er lurt å velge et navn slik at man husker hva det refererer til. Hvis man vil bruke sin() fra numpy, så skriver man np.sin(). I eksempelet over henter vi sin() fra numpy og konstanten pi fra math. (Motsatt av forrige eksempel!)
Importere del av et bibliotek#
Noen ganger vil man ikke importere hele biblioteker, da kan man importere bare den biten man ønsker seg. I eksempelet under vil vi importere en plottefunksjon fra mathplotlib, som er et ganske omfattende bibliotek.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-4,4,100)
y = x**2-4
plt.plot(x,y)
[<matplotlib.lines.Line2D at 0x1f1209e9580>]

Koden over importerer kun underbiblioteket pyplot og vi gir det det lokale aliaset plt, som nå refererer direkte til dette.