Egendefinerte funksjoner i Python - Naturfag (SF) - NDLAHopp 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?
Siden prisen på en enhet er 45 kroner, blir inntektsfunksjonen
Oppgave – regning
Finn en funksjon for overskuddet ut ifra de to funksjonene over.
Løsningsforslag
Overskuddet finner vi ved å trekke kostnadene fra inntekten.
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 -verdier, om vi vil). Disse tallene må settes inn i funksjonen , 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 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
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 -verdi.
Regn ut følgende:
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.
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 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 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 ?