Tabellen under viser portotakst for brev inntil 2 cm tykke i Norge i 2024.
Eksempel 1 under viser hvordan vi kan skrive Python-kode som leser inn et brevs vekt, og basert på denne tabellen beregner og skriver ut porto. Vi operer med vekt i hele gram, og har ingen feilkontroll, det vil si at vi forutsetter at det leses inn en vekt mellom 0 og 2000 gram.
Eksempel 1:
# Leser inn vekt og beregner porto
vekt = int(input("Oppgi vekt i gram: "))
if vekt < 20:
porto = 23
elif 20 <= vekt < 50:
porto = 29
elif 50 <= vekt < 100:
porto = 36
elif 100 <= vekt < 350:
porto = 55
elif 350 <= vekt < 1000:
porto = 90
elif 1000 <= vekt < 2000:
porto = 125
print(f"Porto på et brev på {vekt} g er kr {porto},-")
Men la oss så studere logikken i en if-struktur med elif og else, illustrert med dette flytskjemaet.

Hvis betingelse 1 er sann, utføres kodeblokk 1, deretter hopper Python forbi resten av if-strukturen. Det vil si at betingelse 2 bare sjekkes hvis betingelse 1 er usann. Hvis betingelse 2 er sann, utføres kodeblokk 2, deretter hopper Python forbi resten av if-strukturen. Det vil si at betingelse 3 bare sjekkes hvis både betingelse 1 og 2 er usanne. Hvis betingelse 3 er sann, utføres kodeblokk 3, deretter hopper Python forbi resten av if-strukturen. Hvis ingen av betingelsene er sanne, utføres kodeblokk 4, som er knyttet til else.
Tolker vi eksempel 1 i forhold til flytskjemaet, er betingelse 1:
vekt < 20
Hvis denne betingelsen er sann, settes porto til 23, og det sjekkes ikke flere betingelser. Betingelse 2 er
20 <= vekt < 50
Men siden denne betingelsen ikke sjekkes hvis vekt < 20, vet vi allerede at 20 <= vekt. Vi trenger ikke sjekke det på nytt, og betingelsen kan forenkles til
vekt < 50
Tilsvarende logikk kan brukes på resten av betingelsene. Hvis en betingelse blir sjekket, vet vi at ingen av de foregående betingelsene kan ha vært sanne. Koden i eksempel 1 kan derfor forenkles slik det er vist i eksempel 2.
Eksempel 2:
# Leser inn vekt og beregner porto
vekt = int(input("Oppgi vekt i gram: "))
if vekt < 20:
porto = 23
elif vekt < 50:
porto = 29
elif vekt < 100:
porto = 36
elif vekt < 350:
porto = 55
elif vekt < 1000:
porto = 90
else:
porto = 125
print(f"Porto på et brev på {vekt} g er kr {porto},-")
Logikken i eksempel 2 er imidlertid avhengig av at rekkefølgen på betingelsene er riktig. Flytter vi for eksempel betingelsen vekt < 1000 øverst, vil den feilaktig fange opp brev med vekt inntil 20, 50, 100 og 350 gram også.
At rekkefølgen på kodelinjer har betydning, er så sentralt i programmering at vi bruker rekkefølgen på betingelser som en del av logikken i if-strukturer.
Vi kan godt snu på logikken i eksempel 2, og først sjekke om vekt >= 1000, så om vekt >= 350, og så videre, slik det er vist i eksempel 3:
Eksempel 3:
# Leser inn vekt og beregner porto
vekt = int(input("Oppgi vekt i gram: "))
if vekt >= 1000:
porto = 125
elif vekt >= 350:
porto = 90
elif vekt >= 100:
porto = 55
elif vekt >= 50:
porto = 36
elif vekt >= 20:
porto = 29
else:
porto = 23
print(f"Porto på et brev på {vekt} g er kr {porto},-")
Gramprisen på et krydder som selges i løsvekt, er i utgangspunktet kr 0,90, men det gis rabatt for større mengder. For 25 gram eller mer er gramprisen kr 0,80, for 50 gram eller mer er gramprisen kr 0,75, og for 100 gram eller mer er gramprisen kr 0,70.
Python-kode som leser inn vekt og beregner pris, kan se slik ut:
vekt = int(input("Oppgi vekt i gram: "))
if vekt < 25:
pris = 0.90
elif 25 <= vekt < 50:
pris = 0.80
elif 50 <= vekt < 100:
pris = 0.75
elif vekt >= 100:
pris = 0.70
print(f"Total pris på {vekt} g krydder er kr {pris * vekt:.2f}")
Men på samme måte som i eksempel 1 er det en del overflødige betingelser i koden. Fjern disse, etter modell av det som ble gjort i eksempel 2. Skriv så om koden slik at betingelsene sjekkes i omvendt rekkefølge, etter modell av eksempel 3.
Kilder
-
- Matthes A. (2019). Python Crash Course. no starch press
Se film om å strukturere if