Variabler og datatyper#

Læringsutbytte

Etter å ha arbeidet med dette temaet, skal du kunne:

  1. kjøre enkle programmer med en programmeringseditor

  2. bruke variabler til å representere kjemiske størrelser og enheter

  3. definere og gjøre rede for ulike variabeltyper: heltall, flyttall, strenger og boolske verdier

  4. skrive ut output ved å bruke print-funksjonen

  5. gjøre enkel aritmetikk i Python

  6. ta input fra brukeren av programmet

  7. importere og bruke biblioteker

  8. formatere output ved hjelp av f-strenger

Variabler#

Den mest grunnleggende størrelsen i programmering er variabler. Det kommer vi til å bruke i nesten hvert eneste program vi lager. En variabel kan lagre en verdi, for eksempel tall, tekst eller en liste med mange tall.

Når vi skriver temperatur = 298, lager vi en variabel med navnet temperatur og gir den verdien 298. Likhetstegnet er her en tilordningsoperator: Verdien på høyre side tilordnes variabelen på venstre side. Det betyr at temperatur = 298 ikke er en matematisk likning, men en instruks til datamaskinen.

Variabel

En programmeringsvariabel er en størrelse som lagrer en verdi i et program.

Variabelnavn kan inneholde bokstaver, tall og understrek, men kan ikke starte med et tall eller inneholde mellomrom. Python skiller også mellom små og store bokstaver. Variablene temperatur og Temperatur er derfor to forskjellige variabler. Bruk navn som forteller hva verdien representerer. konsentrasjon_HCl er for eksempel mer informativt enn bare x.

Variabler er spesielt nyttige når vi skal bruke samme verdi flere ganger, eller når vi skal oppdatere en verdi underveis i programmet. I et kjemiprogram kan en variabel for eksempel representere en masse, en temperatur, en konsentrasjon eller et volum. Dersom vi tilsetter titrant i trinn på 1 mL, kan vi beskrive dette slik med en pseudokode:

volum_tilsatt = 0
gjenta 10 ganger:
    volum_tilsatt = volum_tilsatt + 1
    vis volum_tilsatt på skjermen

Verdien som ligger i variabelen volum_tilsatt, blir altså oppdatert for hver tilsetning. Instruksen volum_tilsatt = volum_tilsatt + 1 ville ikke gitt mening som en matematisk likning, men i et program betyr den at den gamle verdien hentes fram, økes med 1 og lagres i den samme variabelen. Du kan tenke på en variabel som en boks vi kan putte ting i, og som vi kan modifisere, endre og hente informasjon fra underveis.

Underveisoppgave

Nedenfor er et eksempel på en programkode i Python der vi beregner stoffmengden i fire prøver med henholdsvis 2,922 g, 5,844 g, 8,766 g og 11,688 g NaCl. Hva er fordelen med å lagre den molare massen i variabelen molar_masse_NaCl?

molar_masse_NaCl = 58.44  # g/mol

n1 = 2.922/molar_masse_NaCl
n2 = 5.844/molar_masse_NaCl
n3 = 8.766/molar_masse_NaCl
n4 = 11.688/molar_masse_NaCl

Print#

For å få noe ut av programmet vårt, må vi be datamaskinen om å “skrive ut” noe. Dette gjør vi med kommandoen print. Resultatet vises i konsollen, som er området der programmeringsmiljøet viser output. Dersom vi ønsker å skrive ut flere variabler eller verdier, må vi skille dem med komma i print-funksjonen. Vi kan også bruke print-funksjonen til å gjøre beregninger direkte. Her er noen eksempler:

print(n1)
print(n1, n2, n3, n4)
print("Stoffmengden i prøve 4 er:", n4, "mol.")
print(2+5/7 - 3*2.1 + 14.5**0.5)
0.05
0.05 0.1 0.15 0.2
Stoffmengden i prøve 4 er: 0.2 mol.
0.22217226721766803

Underveisoppgave

Lag et program som regner ut konsentrasjonen i mol/L når 0,10 mol av et stoff er løst i et totalvolum på 0,50 L. Skriv ut en svarsetning med enhet.

Kommentarer#

Bruk av kommentarer i koden er viktig for at en selv skal huske hva koden illustrerer, hvilke enheter som brukes, og liknende. I tillegg er det viktig dersom andre skal bruke koden din til noe, for eksempel i store samarbeidsprosjekter. I kjemiske beregninger er det spesielt nyttig å kommentere antakelser og enheter, siden Python ikke holder styr på enhetene for oss.

Kommentarer legges til ved å sette en # foran kommentaren. Hvis kommentaren går over flere linjer, bør hver linje starte med #. Triple anførselstegn kan brukes til å lage en tekststreng over flere linjer. En slik tekststreng først i et program eller en funksjon kan brukes som dokumentasjon, altså en beskrivelse av hva en kode gjør og hvordan den fungerer. Her er et eksempel:

"""
Beregner varmen som kreves for å øke temperaturen
i en vannprøve, dersom vi ser bort fra varmetap
"""

masse = 100.0          # masse vann i g
varmekapasitet = 4.18  # spesifikk varmekapasitet i J/(g*K)
temperaturendring = 10 # temperaturendring i K

varme = masse*varmekapasitet*temperaturendring
print("Vannprøven tar opp", varme, "J.")
Vannprøven tar opp 4180.0 J.

Aritmetikk#

Vi kan bruke Python som en enkel kalkulator. Vi har blant annet følgende operatorer:

Operator

Forklaring

+

Addisjon (a + b)

-

Subtraksjon (a - b)

*

Multiplikasjon (a*b)

/

Divisjon (a/b)

**

Eksponent (a**b)

Python følger den vanlige regnerekkefølgen: Potenser beregnes før multiplikasjon og divisjon, som igjen beregnes før addisjon og subtraksjon. Bruk parenteser når du vil endre rekkefølgen eller gjøre uttrykket lettere å lese. Uttrykkene n*R*T/V og (n*R*T)/V gir for eksempel samme resultat, men parentesene kan gjøre sammenhengen med en kjemisk formel tydeligere.

I programkode bruker vi punktum som desimalskilletegn. Tallet 0,25 skrives derfor som 0.25.

Underveisoppgave

Det finnes også to spesielle operatorer: // og %. Finn ut hva disse operatorene gjør ved å prøve dere fram i koderuta nedenfor. Vi har lagt til noen linjer som du kan bruke som utgangspunkt, men du kan eksperimentere som du ønsker.

Eksempel fra kjemilaboratoriet

Vi har 24 mL av en løsning og skal fylle prøveglass med 5 mL i hvert glass. Siden volumene i dette forenklede eksempelet er oppgitt som hele milliliter, kan vi bruke heltallsdivisjon til å finne antall fulle prøveglass og modulus til å finne restvolumet:

totalt_volum = 24       # mL
volum_per_glass = 5     # mL

antall_fulle_glass = totalt_volum // volum_per_glass
restvolum = totalt_volum % volum_per_glass

print("Vi kan fylle", antall_fulle_glass, "prøveglass.")
print("Da gjenstår", restvolum, "mL av løsningen.")

Programmet viser at vi kan fylle fire prøveglass, og at det blir 4 mL igjen. I laboratoriet måler vi ofte volum med desimaltall. Da er vanlig divisjon (/) som regel mer relevant. Heltallsdivisjon og modulus er først og fremst nyttig når vi skal fordele et helt antall enheter eller finne ut hvor mye som blir til overs.

Biblioteker#

Mange matematiske funksjoner er ikke innebygd i selve Python-språket. For å få tilgang til funksjoner som sqrt, cos og log, må vi importere biblioteker eller moduler i programmet. Python har et standardbibliotek som heter math, men i dette kurset bruker vi ofte NumPy fordi biblioteket også kan utføre beregninger på mange tall samtidig. Det blir spesielt nyttig når vi senere skal arbeide med datasett og simuleringer.

Det finnes ulike måter å importere på. Her er noen måter vi kan importere det svært nyttige numpy-biblioteket (numerical python):

# Første metode: Importerer kun funksjonene du trenger
from numpy import log10

konsentrasjon_H3O = 1E-7  # mol/L
pH = -log10(konsentrasjon_H3O)

# Andre metode: Importerer hele biblioteket
import numpy

R = 8.314       # J/(mol*K)
T = 298         # K
M_O2 = 0.032    # kg/mol
v_rms = numpy.sqrt(3*R*T/M_O2)

# Tredje metode: Importerer hele biblioteket med et alias.
# Dette er den mest brukte metoden.
import numpy as np

A = 1E12        # preeksponentiell faktor i 1/s
E_a = 75000     # aktiveringsenergi i J/mol
k = A*np.exp(-E_a/(R*T))

# Fjerde metode: Importerer alt fra biblioteket uten å
# spesifisere hvor funksjonene kommer fra
from numpy import *

pH = -log10(1E-7)
v_rms = sqrt(3*R*T/M_O2)

Underveisoppgave

Studer måtene å importere biblioteker på og forklar forskjellen på dem.

Metode 3 ovenfor er den vanligste metoden for import av biblioteker, og den skal vi benytte mest. I mange av videoene benyttes derimot stjerneimport fra et samlebibliotek som heter pylab (from pylab import *). Det inneholder blant annet funksjoner fra bibliotekene numpy og matplotlib (et visualiseringsbibliotek), og ble brukt for å forenkle koden. Stjerneimport gjør det imidlertid vanskeligere å se hvor funksjonene kommer fra. Derfor bruker vi hovedsakelig metode 3 videre.

La oss se på et eksempel: RMS-farten til gassmolekyler, \(v_{rms}\), er kvadratroten av middelverdien til de kvadrerte molekylfartene. Den kan beregnes fra sammenhengen:

\[ v_{rms}=\sqrt{\frac{3RT}{M}} \]

Her er \(R=8{,}314\) J mol\(^{-1}\) K\(^{-1}\), \(T\) temperaturen i K og \(M\) den molare massen i kg/mol.

Underveisoppgave

Lag et program som regner ut RMS-farten til oksygenmolekyler ved 298 K. Den molare massen til \(O_2\) er 0,032 kg/mol. Importer bare funksjonen sqrt fra numpy-biblioteket.

Kunne du utført beregningen uten å importere sqrt?

Brukerinput#

Vi kan også få programmet vårt til å spørre brukeren om å taste inn verdier. Det kan for eksempel være nyttig dersom det samme programmet skal brukes til å beregne stoffmengden i flere prøver med ulik masse. For å få brukerinput bruker vi funksjonen input.

Funksjonen input gir alltid en tekststreng. Hvis brukeren skal skrive inn et tall vi vil regne videre med, må teksten konverteres til et heltall eller flyttall. I programmet nedenfor bruker vi derfor float(input(...)) til å hente massen av NaCl. Deretter beregner programmet stoffmengden ved å dele massen på den molare massen:

molar_masse_NaCl = 58.44  # g/mol
masse = float(input("Masse NaCl i g: "))

stoffmengde = masse/molar_masse_NaCl
print(masse, "g NaCl tilsvarer", stoffmengde, "mol.")

Les programmet linje for linje og forklar hva som skjer. Hvilken masse må brukeren skrive inn for at programmet skal gi 0,10 mol NaCl? Du kan kopiere koden til en programmeringseditor og prøve med ulike masser. Når programmet kjøres, skriver brukeren input-verdien i konsollen.

Input er ikke nødvendig for annet enn å lage et mer interaktivt program. Men hvis du lager et program med input, bør du legge til input helt til slutt. Start med å gi variablene verdier, og test at programmet fungerer. Deretter kan du bruke input på de variablene du ønsker. Dette er for å unngå å måtte taste inn input-verdier hver gang du kjører programmet ditt, spesielt hvis det inneholder feil du må rette opp!

Underveisoppgave

Modifiser programmet som beregner RMS-farten til oksygenmolekyler, slik at temperaturen i K tas som input fra brukeren. Husk at input-verdien må konverteres til et tall.

F-strengformatering#

Når vi kombinerer tekst og variabler i en utskrift, kan vi skille dem med komma slik vi har gjort til nå. En annen og ofte mer oversiktlig metode er å bruke en formatert tekststreng, vanligvis kalt en f-streng. Vi setter bokstaven f foran anførselstegnet og skriver variabler eller uttrykk i krøllparenteser:

print(f"{masse} g {stoff} tilsvarer {stoffmengde} mol.")

Python erstatter innholdet i krøllparentesene med verdiene som ligger i variablene. Fordelen er at vi kan skrive hele svarsetningen som én sammenhengende tekst. Vi kan også bestemme hvor mange desimaler som skal vises.

stoff = "NaCl"
masse = 2.922       # g
molar_masse = 58.44 # g/mol

stoffmengde = masse/molar_masse

print(f"{masse} g {stoff} tilsvarer {stoffmengde} mol.")
print(f"{masse:.2f} g {stoff} tilsvarer {stoffmengde:.3f} mol.")
2.922 g NaCl tilsvarer 0.05 mol.
2.92 g NaCl tilsvarer 0.050 mol.

I den siste utskriften betyr :.2f at verdien skal vises som et flyttall med to desimaler, mens :.3f gir tre desimaler. Formateringen endrer bare hvordan tallet vises, ikke verdien som er lagret i variabelen. Det er som regel lurt å beholde alle sifrene i selve beregningen og avrunde når resultatet skrives ut.

Underveisoppgave

Modifiser et av programmene du har lagd tidligere slik at resultatet skrives ut med en f-streng. Massen skal vises med to desimaler og stoffmengden med tre desimaler.

Variabeltyper#

I matematikk har vi ulike tallmengder, som reelle tall, irrasjonale tall, rasjonale tall, naturlige tall, hele tall og komplekse tall. Mange av disse tallmengdene inneholder uendelig mange tall, mens en datamaskin har begrenset lagringsplass. Python bruker derfor ulike datatyper til å representere tall og andre verdier. Et flyttall (float) er for eksempel en tilnærmet representasjon av et reelt tall. Det betyr at enkelte beregninger kan gi små avrundingsfeil. De viktigste variabeltypene ser du her:

Datatype

Forklaring

Eksempel

Heltall (int)

Hele tall

antall_C = 12

Flyttall (float)

Desimaltall

konsentrasjon = 0.10

Streng (str)

Tekst

stoff = "NaCl"

Boolsk verdi (bool)

Sann eller usann

er_sur = True

Når vi ønsker input fra en bruker av et program, må vi spesifisere hvilken variabeltype vi ønsker at inputen skal bli tolket som. Standard er tekst, men hvis vi for eksempel “adderer” teksten “4” med “2”, får vi “42”, mens tallet 4 + tallet 2 gir tallet 6. Eksempelet nedenfor illustrerer dette.

tekst1 = input("Skriv et tall: ")
tekst2 = input("Skriv et tall til: ")

tall1 = float(tekst1)
tall2 = float(tekst2)

tullsvar = tekst1 + tekst2
tallsvar = tall1 + tall2

print("Summen av teksten er:", tullsvar, "og summen av tallene er:", tallsvar)
Skriv et tall: 4
Skriv et tall til: 2
Summen av teksten er: 42 og summen av tallene er: 6.0

Underveisoppgave

Lag et program som ber brukeren om å skrive inn navnet på et kjemisk stoff og den molare massen i g/mol. Lagre svarene i variabler, og skriv ut en setning på formen «NaCl har en molar masse på 58.44 g/mol».

Hvilken datatype får de to variablene dersom du ikke konverterer inputen? Modifiser deretter programmet slik at den molare massen lagres som et flyttall.

Datamaskinen krever nøyaktige instrukser#

Når du lager sammensatte programmer med Python, må du huske på følgende:

  • Programmet leses fra topp til bunn og fra venstre til høyre.

  • Små bokstaver er IKKE lik store bokstaver (p \(\neq\) P).

  • Python bryr seg lite om mellomrom, med mindre det er på starten av ei linje. Bruk mellomrom for å gjøre programmet ditt mer lesbart.

  • Python vet ikke om et tall representerer gram, liter eller mol/L. Bruk tydelige variabelnavn og kommentarer til å holde styr på enhetene.

  • Øv deg på å lese feilmeldinger: Du får beskjed om linja der feilen befinner seg og typen feil.

Underveisoppgave

Forklar hva som er feil med følgende programmer:

tall1 = 1
print(tall1 + tall2)
tall2 = 3
navn = "Gunnar"
print(Navn)
a = 2
b = 3

print("Differansen mellom" a "og" b "=" a + b)
https://live.staticflickr.com/3136/2842497804_f2684b2dcf_c.jpg

Fig. 1 En av de første “bugs” ble funnet av Grace Hopper, som også lagde den første kompilatoren, en oversetter fra programmeringsspråk til maskinkode. Bugs var altså faktiske insekter som satt seg fast i de mekaniske delene og lagde krøll. Forhåpentligvis får du ingen feilmeldinger om insekter i datamaskinen din.#

Oppgaver#

Oppgave 1.1 – molar masse av vann

Bruk startkoden nedenfor til å lage variabler for den molare massen til hydrogen og oksygen. Bruk variablene til å regne ut den molare massen til vann, \(H_2O\), og skriv ut en svarsetning med enhet. Programmet inneholder litt kode fra før til å hjelpe deg på vei.

molar_masse_H = 1.008  # g/mol
molar_masse_O = 16.00  # g/mol

# Lag resten av programmet her

Oppgave 1.2

Tettheten til et stoff er gitt ved:

\[\rho = \frac{m}{V}\]

Lag et program som regner ut tettheten i g/mL når 39,5 g av en væske har et volum på 50,0 mL. Utvid programmet slik at massen og volumet blir tatt som input.

Oppgave 1.3

Lag et program som regner ut pH gitt konsentrasjonen av \(H_3O^+\)-ioner. Her kan du bruke tilnærmingen \(\mathrm{pH}=-\log_{10}[H_3O^+]\) og se bort fra forskjellen mellom konsentrasjon og aktivitet.

Oppgave 1.4

a) Lag et program der du definerer innholdet av H-, C- og O-atomer i et karbohydrat i hver sine variabler. Den molare massen til hver av grunnstoffene skal også tilordnes hver sin variabel. Print så ut den molare massen til sukrose (\(C_{12}H_{22}O_{11}\)).

b) Lag en variabel som inneholder massen av innveid sukrose. Modifiser programmet fra oppgave a) slik at det printer ut hvor mange mol sukrose dette er, og hvor mange sukrosemolekyler dette tilsvarer.

Oppgave 1.5

Når vi fortynner en løsning, er antall mol av stoffet vi fortynner likt før og etter fortynningen: \(n_0 = n_1\). Siden \(n = c\cdot V\), der \(c\) er konsentrasjonen i mol/L og \(V\) er volumet i L, får vi følgende sammenheng:

\[c_1V_1 = c_2V_2\]

Dette kaller vi fortynningsloven.

Lag et program som regner ut den nye konsentrasjonen hvis du fortynner 25 mL løsning med konsentrasjon 0,50 mol/L til 1,0 L.

Oppgave 1.6

Lag et program som bruker en valgfri formel fra kjemi til å regne ut noe. Bruk input-funksjonen til å hente variabelverdier fra brukeren.

Oppgave 1.7

Mellom et elektron og et proton i et hydrogenatom virker det hovedsakelig to krefter: Én elektrisk kraft og én gravitasjonskraft. Størrelsen på den elektriske kraften kan uttrykkes ved Coulombs lov:

\[F_e = k_e\frac{|q_1q_2|}{r^2}\]

hvor \(k_e\) er Coulombs konstant (\(8.987742438\cdot10^9\) N m\(^2\) C\(^{-2}\)), \(q_1\) og \(q_2\) er ladningen til de to partiklene, og \(r\) er avstanden mellom partiklene. Siden vi har å gjøre med et proton og et elektron, er størrelsen på ladningen lik elementærladningen \(e\): \(|q_{proton}| = |q_{elektron}| = e = 1.602176634\cdot10^{-19}\) C.

Gravitasjonskraften kan vi uttrykke ved hjelp av Newtons gravitasjonslov:

\[F_g = G \frac{m_1m_2}{r^2}\]

der \(F_g\) er størrelsen på gravitasjonskraften som virker mellom to legemer med henholdsvis masse \(m_1\) og \(m_2\) med avstand \(r\) mellom hverandres tyngdesentre. \(G\) er gravitasjonskonstanten (\(G= 6.674\cdot 10^{-11}\) N m\(^2\) kg\(^{-2}\)), og avstanden mellom et proton og et elektron i hydrogenatomet er omtrent lik Bohr-radiusen, \(a_0 = 5.292\cdot10^{-11}\) m. Massen til et proton og et elektron er henholdsvis \(m_p = 1.672\cdot10^{-27}\) kg og \(m_e = 9.109\cdot10^{-31}\) kg.

a) Legg alle konstanter i hver sine variabler. Bruk kommentarer til å spesifisere hva de ulike variablene betyr og hvilken enhet de har. Benytt også gode variabelnavn. b) Lag to nye variabler der du beregner den elektriske kraften og gravitasjonskraften som virker mellom et elektron og et proton i hydrogenatomet. c) Print ut forholdet mellom kreftene med en beskrivende svarsetning. Hva sier dette deg? Legg svaret på dette spørsmålet i en flerlinjekommentar til slutt i programmet.

Oppgave 1.8

Absorbansen \(A\) til en løsning kan i et bestemt konsentrasjonsområde beskrives med Beer–Lamberts lov:

\[A = \varepsilon l c\]

Her er \(\varepsilon\) den molare absorptiviteten, \(l\) lysveien gjennom prøven og \(c\) konsentrasjonen.

a) Lag et program som beregner absorbansen når \(\varepsilon = 1{,}50\cdot10^4\) L mol\(^{-1}\) cm\(^{-1}\), \(l=1{,}00\) cm og \(c=2{,}50\cdot10^{-5}\) mol/L. Bruk tydelige variabelnavn og kommentarer med enheter.

b) Utvid programmet slik at konsentrasjonen tas som input fra brukeren.

Oppgave 1.9

For en idealgass er sammenhengen mellom trykk, volum, stoffmengde og temperatur gitt ved:

\[pV=nRT\]

Lag et program som beregner trykket i bar når \(n=0{,}050\) mol, \(T=25{,}0\) °C og \(V=1{,}50\) L. Bruk \(R=0{,}08314\) L bar mol\(^{-1}\) K\(^{-1}\). Husk at temperaturen må omregnes til kelvin før den brukes i idealgassloven.

Utvid programmet slik at temperaturen i grader celsius tas som input. Hvorfor kan det være nyttig å beholde både temperatur_celsius og temperatur_kelvin som variabler?

Videoer#

Her kan du se videoer som introduksjon og/eller repetisjon til fagstoffet: