Hopp til innhald
Nynorsk

Fag

Fagstoff

Eigendefinerte funksjonar i Python

Standard Python inneheld mellom anna funksjonane print() og len(), men vi kan lage våre eigne funksjonar òg. Kvifor ikkje lage oss ein matematisk funksjon?

Problemstilling

Vi tenker oss no ei bedrift som har ein funksjon som modell for kostnadene K i kroner ved å produsere x einingar av ei vare lik

K(x)=0,25x2+500

Sidan prisen på ei eining er 45 kroner, blir inntektsfunksjonen

Ix=45x

Oppgåve – rekning

Finn ein funksjon O for overskotet ut frå dei to funksjonane over.

Løysingsforslag

Overskotet finn vi ved å trekke kostnadene frå inntekta.

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

Vi går no ut frå at bedrifta produserer 60 einingar per dag. Dei vurderer å auke produksjonen til 100 einingar per dag, og dei lurer på kor mykje overskotet endrar seg. Oppdraget vårt blir å lage eit program som kan rekne ut forskjellen i overskot ved to ulike tal på produserte einingar.

Koding utan å bruke eigendefinert funksjon

Programmet må rekne ut kva overskotet er når det blir produsert 100 einingar, og trekke frå overskotet når det blir produsert 60 einingar. Så må svaret skrivast til skjermen.

🤔 Tenk over: Korleis skriv vi reknestykket over matematisk ved hjelp av funksjonen O?

Forklaring

O100-O60

Oppgåve – algoritme

Over har vi beskrive kva programmet skal gjere. Skriv ein litt meir detaljert algoritme til eit slikt program der du bruker variablar for den noverande og for den nye produksjonsmengda. Hugs å få med gode, forklarande tekstar.

Forslag til algoritme
  • Set variabelen x_gml lik 60.
  • Set variabelen x_ny lik 100.

  • Rekn ut overskotet med talet i variabelen x_gml ved hjelp av funksjonsuttrykket til O, og set det lik variabelen O_gml.

  • Rekn ut overskotet med talet i variabelen x_ny ved hjelp av funksjonsuttrykket til O, og set det lik variabelen O_ny.

  • Skriv til skjermen: "Endringa i overskotet ved å endre produksjonen frå <x_gml> til <x_ny> einingar er <O_ny - O_gml> kroner."

I siste punkt betyr vinkelparentesane at vi skal ha verdien av variablane.

Oppgåve – koding

Skriv koden til programmet etter algoritmen over i ein programeditor for Python. Kontroller at programmet reknar rett ved til dømes å skrive funksjonen inn i GeoGebra og rekne ut O100-O60.

Løysingsforslag
Python
1x_gml = 60
2x_ny = 100
3O_gml = -0.25*x_gml**2 + 45*x_gml - 500
4O_ny = -0.25*x_ny**2 + 45*x_ny - 500
5print(f"Endringa i overskotet ved å endre produksjonen"
6f" frå {x_gml} til {x_ny} einingar er {O_ny - O_gml:.2f} kroner.")

Programmet gir følgande utskrift: "Endringa i overskotet ved å endre produksjonen frå 60 til 100 einingar er 200.00 kroner."

Koding med eigendefinert funksjon

I utrekningane i linje 3 og 4 har vi brukt den matematiske funksjonen O for overskotet som vi kom fram til lenger opp på sida. Innhaldet i linjene er vanskeleg å lese. Tenk om vi kunne ha brukt skrivemåten frå matematikken her! Matematisk skriv vi

O100-O(60)

for å finne endringa i overskotet ved å endre produksjonen frå 60 einingar til 100. Dette kan kan vi heldigvis gjere i Python òg. Vi kan fjerne linje 3 og 4, og i linje 6 kan vi erstatte O_ny - O_gml med

O(x_ny) - O(x_gml)

For å kunne gjere det må vi lage oss funksjonen O, og korleis gjer vi det i Python? Jo, vi kan definere funksjonen med kodeordet def. Funksjonen O blir med dette ein såkalla eigendefinert funksjon. Det betyr at vi øvst i programmet vårt skriv følgande:

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

Desse to kodelinjene blir ikkje utførte i første omgang når vi køyrer programmet fordi dei utgjer ein definisjon. Kodelinjene blir ikkje utførte før vi kallar på den eigendefinerte funksjonen O første gong ved å skrive O(x_ny) i koden nedanfor funksjonsdefinisjonen. Då skjer følgande:

  • Programmet vil leite opp definisjonen av funksjonen O.

  • Programmet erstattar x i definisjonen med innhaldet av variabelen x_ny.

  • Vi får rekna ut overskotet ved denne produksjonsmengda.

Oppgåve – koding

Endre på programmet ved å definere funksjonen O, fjerne variablane O_gml og O_ny og i staden kalle på funksjonen O. Kontroller at programmet fungerer som før.

Løysingsforslag
Python
1def O(x):
2  return -0.25*x**2 + 45*x - 500
3
4x_gml = 60
5x_ny = 100
6print(f"Endringa i overskotet ved å endre produksjonen"
7f" frå {x_gml} til {x_ny} einingar er {O(x_ny) - O(x_gml):.2f} kroner.")

Koden gir same utskrift som før.

b) Kva endringar blir det i algoritmen til programmet når vi bruker den eigendefinerte funksjonen O i staden for å rekne ut overskotsendringa direkte?

Løysingsforslag

Algoritmen til programmet blir kortare:

  • Set variabelen x_gml lik 60.
  • Set variabelen x_ny lik 100.

  • Skriv til skjermen: "Endringa i overskotet ved å endre produksjonen frå <x_gml> til <x_ny> einingar er <O(x_ny) - O(x_gml)> kroner."

Sjølve funksjonsdefinisjonen er ikkje ein del av algoritmen til programmet sidan det berre er ein definisjon. Funksjonen O(x) har sin eigen algoritme:

  • Rekn ut følgande: -0,25·x2+45·x-500 
  • Returner svaret.

Spørsmål – vurdering

Kvifor er det lurt å endre programkoden ved å lage ein eigendefinert funksjon?

Svar

Den viktigaste årsaka er at vi får ryddigare og kortare programkode (sjølv om koden ikkje vart kortare her). Dette blir viktigare og viktigare jo større programmet blir.

Ei anna viktig årsak er gjenbruk av kode. Kanskje skal den funksjonen du definerer i eitt program brukast i eit anna program? Då er det berre å kopiere og lime inn heile funksjonsdefinisjonen inn i det andre programmet. Å definere eigne funksjonar gjer det mykje lettare å utveksle kode med andre. I Python finst det mange programbibliotek med eigendefinerte funksjonar som vi kan laste ned og bruke.

Pythonkode å lære seg

Vis innhald

Eigendefinert funksjon

Struktur:

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

Kodelinjene her er definisjonar og blir ikkje utførte før det blir skrive funksjonsnamn(verdi1, verdi2, ...) i den eigentlege programkoden nedanfor funksjonsdefinisjonen. Hugs kolon på slutten av linja som byrjar med "def", og legg merke til at kodelinjene til ein funksjon skal rykkast inn.

Døme:

Vi skal bruke den matematiske funksjonen f(x)=3x-2 i eit program som skal rekne ut funksjonsverdiar. Då skriv vi

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

øvst i programkoden. Kodeordet return bruker vi for å få tilbake noko frå funksjonen. Dersom vi i koden til programmet skriv

verdi = f(1)

vil funksjonen rekne ut f(1)=3·1-2=1 og setje det lik variabelen verdi.

I dømet skal funksjonen f berre ha éin verdi inn (x), men vi kan lage funksjonar som skal ha inn fleire verdiar, som det generelle dømet over viser.

Aktivitetar

a) Algoritme

Bedrifta ønsker å få testa kor stort overskotet er ved fleire ulike produksjonsmengder: 40, 80, 120, 160, 200 og 240.

Skriv ein algoritme for eit slikt program. Bruk den eigendefinerte funksjonen O frå over.

Forslag til algoritme

Her kan vi utnytte at produksjonsmengda aukar med 40 frå eitt nivå til neste.

  • Set variabelen x lik 0.

  • Gjenta 6 gonger:

    • Auk x med 40.

    • Skriv til skjermen: "Overskotet ved <x> produserte einingar er <O(x)> kroner."

I tillegg må vi ha algoritmen for funksjonen O som før.

b) Koding

Skriv ein kode som passar til algoritmen ovanfor.

Løysingsforslag

Det er fleire måtar å løyse dette på. Her vel vi å bruke ei for-lykkje.

Python
1def O(x):
2  return -0.25*x**2 + 45*x - 500
3
4for x in range(40,241,40):
5  print(f"Overskotet ved {x} produserte einingar er {O(x)} kroner.")

Programmet gir at av dei undersøkte produksjonsmengdene blir overskotet størst når det blir produsert 80 einingar. Ved ein produksjon på 200 eller 240 einingar går bedrifta med underskot.

Skrive av Bjarne Skurdal.
Sist oppdatert 14.08.2026