Egendefinerte funksjoner i Python - Matematikk 1T-Y - IM - NDLA

Hopp til innhold
Verktøy og mal

Egendefinerte funksjoner i Python

Standard Python inneholder blant annet funksjonene print() og input(), men vi kan lage våre egne funksjoner også. Hvorfor ikke lage oss en matematisk funksjon?

Problemstilling

I artikkelen Modell for kostnad, inntekt og overskudd har en bedrift en funksjon som er modell for kostnadene K i kroner ved å produsere x enheter av en vare lik

Kx=0,25x2+500

Siden prisen på en enhet er 45 kroner, blir inntektsfunksjonen

Ix=45x

Oppgave – regning

Finn en funksjon for overskuddet O ut ifra de to funksjonene over.

Løsningsforslag

Overskuddet finner vi ved å trekke kostnadene fra inntekten.

Ox = Ix-Kx= 45x-(0,25x2+500)= 45x-0,25x2-500= -0,25x2+45x-500

Vi går nå ut ifra at bedriften produserer 60 enheter per dag. De vurderer å øke produksjonen til 100 enheter per dag, og de lurer på hvor mye overskuddet endrer seg. Oppdraget vårt blir å lage et program som kan regne ut forskjellen i overskudd ved to ulike antall produserte enheter.

Koding uten å bruke egendefinert funksjon

Programmet må ta imot to tall fra brukeren: to antall produserte enheter (eller to x-verdier, om vi vil). Disse tallene må settes inn i funksjonen O, differansen må regnes ut og svaret skrives til skjermen.

Oppgave – algoritme

Skriv algoritmen til et slikt program. Husk å få med gode, forklarende tekster.

Forslag til algoritme
  • Skriv til skjermen "Dette programmet regner ut forskjellen i overskudd ved å endre produksjonsmengden fra ett tall til et annet.".
  • Skriv til skjermen "Skriv inn nåværende produksjonsmengde: ".
  • Ta imot tallet for produksjonsmengde fra brukeren, og sett det lik variabelen p_no.
  • Skriv til skjermen "Skriv inn den nye produksjonsmengden: ".
  • Ta imot tallet for ny produksjonsmengde fra brukeren, og sett det lik variabelen p_ny.
  • Regn ut overskuddet med tallet i variabelen p_ny, og trekk fra svaret på utregningen av overskuddet med variabelen p_no. Sett svaret lik variabelen o_endring.
  • Skriv til skjermen "Endringen i overskuddet ved å endre produksjonen fra <p_no> enheter til <p_ny> er <o_endring> kroner.".

Oppgave – koding

Skriv koden til programmet etter algoritmen over i en programeditor for Python. Kontroller at programmet regner riktig ved for eksempel å se på grafen til overskuddsfunksjonen i artikkelen Modell for kostnad, inntekt og overskudd.

Løsningsforslag

print("Dette programmet regner ut forskjellen i kostnader "
"ved å endre produksjonsmengden fra ett tall til et annet.")
p_no = int(input("Skriv inn nåværende produksjonsmengde: "))
p_ny = int(input("Skriv inn den nye produksjonsmengden: "))
o_endring = -0.25*p_ny**2 + 45*p_ny - 500 - (-0.25*p_no**2 + 45*p_no - 500)
print(f"Endringen i overskuddet ved å endre produksjonen fra "
f"{p_no} enheter til {p_ny} er {o_endring} kroner.")

Koding med egendefinert funksjon

I utregningen i den femte linja har vi brukt den matematiske funksjonen O for overskuddet som vi kom fram til lengre opp på siden. Innholdet i linje 5 er vanskelig å lese. Tenk om vi kunne ha brukt skrivemåten fra matematikken her! Matematisk skriver vi

O100-O(60)

for å finne endringen i overskuddet ved å endre produksjonen fra 60 enheter til 100. Dette kan kan vi heldigvis gjøre i Python også. Vi kan endre den femte linja til følgende:

o_endring = O(p_ny) - O(p_no)

For å kunne gjøre det, må vi lage oss funksjonen O, og hvordan gjør vi det i Python? Jo, vi kan definere funksjonen med kodeordet def. Funksjonen O blir med dette en egendefinert funksjon. Det betyr at vi øverst i programmet vårt skriver følgende:

def O(x):
    return -0.25*x**2 + 45*x - 500

Disse to kodelinjene blir ikke utført i første omgang når vi kjører programmet fordi de utgjør en definisjon. Kodelinjene blir ikke utført før vi kaller på den egendefinerte funksjonen første gang ved å skrive O(p_ny) i koden nedenfor funksjonsdefinisjonen. Da vil programmet lete opp definisjonen av funksjonen O, erstatte x i definisjonen med innholdet av variabelen p_ny, og vi får regnet ut overskuddet ved denne produksjonsmengden.

Oppgave – algoritme og koding

a) Skriv inn øverst i programkoden definisjonen av funksjonen O over. Endre på linja med utregninger som vist ovenfor ved å kalle på den egendefinerte funksjonen, og kontroller at programmet fungerer som før.

b) Hvilke endringer blir det i algoritmen til programmet når vi bruker den egendefinerte funksjonen O i stedet for å regne ut overskuddsendringen direkte?

Løsningsforslag

Det blir egentlig ikke noen endring i algoritmen til programmet. Selve funksjonsdefinisjonen er ikke en del av algoritmen til programmet siden det bare er en definisjon. Den nest siste instruksjonen i algoritmen ovenfor, den eneste plassen der det kunne være en endring, gjelder fremdeles.

Funksjonen O har sin egen algoritme:

  • Ta imot en x-verdi.
  • Regn ut følgende: -0,25·x2+45·x-500 
  • Returner svaret.

Spørsmål – vurdering

Hvorfor er det lurt å endre programkoden ved å lage en egendefinert funksjon?

Svar

Den viktigste årsaken er at vi får ryddigere og kortere programkode. Dette blir viktigere og viktigere jo større programmet blir.

En annen viktig årsak er gjenbruk av kode. Kanskje skal den funksjonen du definerer i ett program brukes i et annet program? Da er det bare å kopiere og lime inn hele funksjonsdefinisjonen inn i det andre programmet. Å definere egne funksjoner gjør det mye lettere å utveksle kode med andre. I Python finnes det mange programbibliotek med egendefinerte funksjoner som vi kan laste ned og bruke.

Pythonkode å lære seg

Vis innhold

Egendefinert funksjon

Struktur:

def funksjonsnavn(parameter1, parameter2, ...):
    kodelinje
    kodelinje
    ...

Kodelinjene her er definisjoner og blir ikke utført før det blir skrevet funksjonsnavn(verdi1, verdi2, ...) i den egentlige programkoden nedenfor funksjonsdefinisjonen. Husk kolon på slutten av linja som begynner med "def", og merk at kodelinjene til en funksjon skal rykkes inn.

Eksempel:

Vi skal bruke den matematiske funksjonen  f(x)=3x-2  i et program som skal regne ut funksjonsverdier. Da skriver vi

def f(x):
    return 3*x - 2

øverst i programkoden. Kodeordet return bruker vi for å få tilbake noe fra funksjonen. Dersom vi i koden til programmet skriver

funksjonsverdi = f(1)

vil funksjonen regne ut  f(1)=3·1-2=1  og sette det lik variabelen funksjonsverdi.

I eksempelet skal funksjonen f bare ha én verdi inn (x), men vi kan lage funksjoner som skal ha inn flere verdier, som det generelle eksempelet over viser.

Aktiviteter

a) Algoritme

Dersom brukeren av programmet taster inn produksjonstall som gjør at endringen av overskuddet blir negativ, for eksempel –100, hadde det vært fint om programmet kunne skrive for eksempel "Overskuddet minker med 100 kroner når antallet produserte enheter blir endret fra ...".

Lag en tilsvarende setning som passer når overskuddet øker og en egen setning som passer når overskuddet er uendret. Endre på algoritmen slik at den tar hensyn til hvordan overskuddet blir endret.

Forslag til algoritme
  • Skriv til skjermen "Dette programmet regner ut forskjellen i overskudd ved å endre produksjonsmengden fra ett tall til et annet.".
  • Skriv til skjermen "Skriv inn nåværende produksjonsmengde: ".
  • Ta imot tallet for produksjonsmengde fra brukeren, og sett det lik variabelen p_no.
  • Skriv til skjermen "Skriv inn den nye produksjonsmengden: ".
  • Ta imot tallet for ny produksjonsmengde fra brukeren, og sett det lik variabelen p_ny.
  • Regn ut overskuddet med tallet i variabelen p_ny, og trekk fra svaret på utregningen av overskuddet med variabelen p_no. Sett svaret lik variabelen o_endring.
  • Dersom o_endring er mindre enn null:

    • Sett o_endring lik minus o_endring.
    • Skriv til skjermen "Overskuddet minker med <o_endring> kroner når antallet produserte enheter blir endret fra <p_no> enheter til <p_ny>.".
  • Dersom o_endring ikke er mindre enn null, men større enn null:

    • Skriv til skjermen "Overskuddet øker med <o_endring> kroner når antallet produserte enheter blir endret fra <p_no> enheter til <p_ny>.".
  • Dersom o_endring verken er mindre enn null eller større enn null:

    • Skriv til skjermen "Overskuddet er uendret når antallet produserte enheter blir endret fra <p_no> enheter til <p_ny>.".

b) Koding

Skriv koden til algoritmen ovenfor.

Tips

Her kan du bruke en if-elif-else-struktur.

Løsningsforslag

def O(x):
     return -0.25*x**2 + 45*x - 500

print("Dette programmet regner ut forskjellen i kostnader "
"ved å endre produksjonsmengden fra ett tall til et annet.")
p_no = int(input("Skriv inn nåværende produksjonsmengde: "))
p_ny = int(input("Skriv inn den nye produksjonsmengden: "))
o_endring = O(p_ny) - O(p_no)

if o_endring < 0:
     o_endring = -o_endring
     print(f"Overskuddet minker med {o_endring} kroner når"
     f" antallet produserte enheter blir endret fra"
     f" {p_no} enheter til {p_ny}.")
elif o_endring > 0:
     print(f"Overskuddet øker med {o_endring} kroner når"
     f" antallet produserte enheter blir endret fra"
     f" {p_no} enheter til {p_ny}.")
else:
     print(f"Overskuddet er uendret når antallet produserte enheter"
     f" blir endret fra {p_no} enheter til {p_ny}.")

NB: Her har vi latt noen kommandoer med print() gå over to linjer. Det kan vi gjøre ved å sette inn ekstra hermetegn slik som over.

c) Algoritme

Programmet bør kontrollere at brukeren skriver inn tall mellom 0 og 200, som er den største mengden enheter bedriften kan produsere. Brukeren av programmet må få en ny sjanse til å skrive inn produksjonsmengden.

Endre på algoritmen ovenfor slik at dette blir oppfylt.

Forslag til algoritme
  • Skriv til skjermen "Dette programmet regner ut forskjellen i overskudd ved å endre produksjonsmengden fra ett tall til et annet.".
  • Skriv til skjermen "Skriv inn nåværende produksjonsmengde: ".
  • Ta imot tallet for produksjonsmengde fra brukeren, og sett det lik variabelen p_no.
  • Så lenge p_no er utenfor det tillatte intervallet: Skriv til skjermen "Du må skrive et positivt, helt tall som er mindre enn 201. Prøv en gang til!". Gå tilbake to steg, og start derifra.
  • Skriv til skjermen "Skriv inn den nye produksjonsmengden: ".
  • Ta imot tallet for ny produksjonsmengde fra brukeren, og sett det lik variabelen p_ny.
  • Så lenge p_ny er utenfor det tillatte intervallet: Skriv til skjermen "Du må skrive et positivt, helt tall som er mindre enn 201. Prøv en gang til!". Gå tilbake to steg, og start derifra.
  • Regn ut overskuddet med tallet i variabelen p_ny, og trekk fra svaret på utregningen av overskuddet med variabelen p_no. Sett svaret lik variabelen o_endring.
  • Dersom o_endring er mindre enn null:

    • Sett o_endring lik minus o_endring.
    • Skriv til skjermen "Overskuddet minker med <o_endring> kroner når antallet produserte enheter blir endret fra <p_no> enheter til <p_ny>.".
  • Dersom o_endring ikke er mindre enn null, men større enn null:

    • Skriv til skjermen "Overskuddet øker med <o_endring> kroner når antallet produserte enheter blir endret fra <p_no> enheter til <p_ny>.".
  • Dersom o_endring verken er mindre enn null eller større enn null:

    • Skriv til skjermen "Overskuddet er uendret når antallet produserte enheter blir endret fra <p_no> enheter til <p_ny>.".
Tips

Her kan det være greit å bruke en if-setning.

d) Koding

Endre programmet slik at det kontrollerer at brukeren skriver inn tall mellom 0 og 200, som er den største mengden enheter bedriften kan produsere.

Tips

Her kan du få bruk for kommandoordet while.

Løsningsforslag

def O(x):
     return -0.25*x**2 + 45*x - 500

print("Dette programmet regner ut forskjellen i kostnader "
"ved å endre produksjonsmengden fra ett tall til et annet.")
p_no = -100
p_ny = -100

while p_no <=0 or p_no > 200:
     p_no = int(input("Skriv inn nåværende produksjonsmengde: "))
     if p_no <=0 or p_no > 200:
          print("Du må skrive et positivt, helt tall som er"
          " mindre enn 201. Prøv en gong til!")

while p_ny <=0 or p_ny > 200:
     p_ny = int(input("Skriv inn den nye produksjonsmengden: "))
     if p_ny <=0 or p_ny > 200:
          print("Du må skrive et positivt, helt tall som er"
          " mindre enn 201. Prøv en gang til!")

o_endring = O(p_ny) - O(p_no)

if o_endring < 0:
     o_endring = -o_endring
     print(f"Overskuddet minker med {o_endring} kroner når"
     f" antallet produserte enheter blir endret fra"
     f" {p_no} enheter til {p_ny}.")
elif o_endring > 0:
     print(f"Overskuddet øker med {o_endring} kroner når"
     f" antallet produserte enheter blir endret fra"
     f" {p_no} enheter til {p_ny}.")
else:
     print(f"Overskuddet er uendret når antallet produserte enheter"
     f" blir endret fra {p_no} enheter til {p_ny}.")

NB: Her har vi latt noen kommandoer med print() gå over to eller tre linjer. Det kan vi gjøre ved å sette inn ekstra hermetegn slik som over.

Hvorfor har vi i starten satt variablene p_no og p_ny lik -100?

Relatert innhold

Skrevet av Bjarne Skurdal.
Sist faglig oppdatert 05.08.2020