Funksjoner
💡 Læringsmål: I dette kapittelet skal du lære å lage funksjoner slik at du kan dele opp koden i mindre biter og kan bruke samme kodebit flere steder.
Hva er en funksjon?
Funksjoner i programmering ligner mistenkelig på funksjoner man lærte om i matematikken på skolen. Som eksempelet i tabellen under viser, tar matematiske funksjoner inn en verdi og gir en verdi tilbake.
x | f(x) = x - 2 |
---|---|
4 | 4 - 2 = 2 |
2 | 2 - 2 = 0 |
0 | 0 - 2 = -2 |
I programmering brukes funksjoner til å abstrahere vekk detaljer slik at man i lange programmer ikke behøver å forholde seg til alle ting hele tiden. I stedet kan man dele koden opp i mindre deler, funksjoner, og man trenger bare å vite navnet på funksjonen og verdiene den eventuelt trenger som input, på det stedet der man vil bruke funksjonen. Det er litt på samme måte som i en matoppskrift, det er ikke alle detaljer som forklares hele tiden. Om det for eksempel står "kok opp 2 liter vann" i oppskriften er det vanligvis ikke forklart hvordan man koker vann.
Funksjoner gjør også at man ikke trenger å gjenta kodelinjer som skal gjøre (nesten) det samme. Det er bedre å ha denne samme funksjonaliteten ett sted i koden. Da er det bare ett sted man må forsikre seg om at funksjonaliteten er kodet riktig, og om man trenger å endre funksjonaliteten senere en gang, er det bare ett sted man trenger å oppdatere.
Funksjoner i Python
En funksjon i Python ser ut på følgende måte:
def lag_hilsen(navn):
hilsen = f"Hei {navn}!"
return hilsen
Første linje i funksjonen består av nøkkelordet def
som angir at definisjonen av funksjonen starter her. Teksten som kommer etterpå er navnet på selve funksjonen, deretter kommer parametrene inni parentesen, før linja avsluttes med :
. Hvis funksjonen ikke skal ta inn noen verdier er det tomt mellom parentesene ()
, hvis funksjonen har flere parametre er de separert med komma (fornavn, etternavn)
. Parametrene brukes som variable inni funksjonen og en parameter vil inneholde verdien som angis når man bruker funksjonen, det som sendes inn som argument til funksjonen.
Selve innholdet i funksjonen kommer på linja etter :
, og alt som skal være inni funksjonen må ha et innrykk. Til sist i funksjonen returneres verdien man vil ha tilbake fra funksjonen ved å skrive return
etterfulgt av det man vil returnere. Funksjoner i Python må ikke ha en eksplisitt returverdi. Om det ikke er noen linje med return
til slutt, vil funksjonen implisitt returnere verdien None
.
Lag en ny Python-fil, f.eks med navn funksjoner.py
, og kopier funksjonen over inn i fila. Deretter kan du i fila kalle funksjonen og lagre resultatet i en variabel, og så printe resultatet:
hilsen = lag_hilsen("Jens")
print(hilsen)
Test ut å kalle funksjonen med ditt eget navn og skriv ut hilsenen til deg selv.
Når man skal sende inn argument til en funksjon kan man eksplisitt navngi parameteren. Det er spesielt nyttig når man har flere argumenter, så man er sikker på at riktig parameter får riktig verdi. I eksempelet kan man derfor skrive:
hilsen = lag_hilsen(navn = "Jens")
I eksempelet er navn
parameter og Jens
argument for funksjonen lag_hilsen
.
✍️ Oppgave: Test å legge til eller endre noe i funksjonen du har i skriptet. Klarer du å endre funksjonen så programmet feiler når du kjører det? Hvorfor feiler det?
✍️ Oppgave: Lag en funksjon som skriver ut hjelp til terminalen
- Lag funksjonen
print_hjelp()
som ikke tar inn noe argument og som ikke returnerer noen verdi. Brukprint()
-funksjonen til å skrive ut en valgfri setning om hjelp til terminal. - Kall funksjonen i programmet, og se at hjelpeteksten skrives ut når programmet kjører.
- Lagre returnverdien fra funksjonen i en variabel, for eksempel
hjelp = print_hjelp()
, og print ut denne variabelen. Hva skrives ut? - Prøv å legge inn en eksplisitt
return None
i slutten av funksjonen, hva skrives ut fra variabelen nå?
✍️ Oppgave: Lag en funksjon som lager bærer fra programkode og type
Tv- og radioprogram har en programkode (eller program-ID) som består av fire bokstaver og åtte tall, for eksempel KMNO10010922
. En type bærer består av to bokstaver, for eksempel AH
, og et program sin bærer består av programkoden til programmet satt sammen med bærertypen, KMNO10010922AH
.
- Lag funksjonen
lag_bærer(programkode, bærertype)
. Denne har to parametere,programkode
ogbærertype
, og skal returnere en streng der programkode og bærertype er satt sammen. - Kall funksjonen i programmet og se at verdien som returneres er som du forventer.
✍️ Oppgave: Lag en funksjon som splitter opp bæreren
- Lag funksjonen
del_opp_bærer(bærer)
som er motsatt avlag_bærer(programkode, bærertype)
. Den skal ta inn en bærer, og dele denne opp iprogramkode
ogbærertype
, og returnere disse to verdiene. Funksjoner kan bare returnere én ting, så en måte å returnere flere ting på er å sette de sammen til et tuppel. - Kall funksjonen i programmet og se at verdien som returneres er som du forventer.
- Prøv å kombinere de to bærer-funksjonene, kall først
lag_bærer
og bruk resultatet herfra som argument tildel_opp_bærer
, og motsatt, kalldel_opp_bærer
og bruk resultatet herfra som argument tillag_bærer
. Hvordan forventer du at disse funksjonene fungerer sammen?
✍️ Oppgave: Rydd opp i programmet
Rydd opp i programmet slik at man unngår at samme funksjonalitet kodes på ulik måte, og ikke har funksjonalitet duplisert i koden. Bruk minst én av bærer-funksjonene over, du kan også lage nye funksjoner der du synes det passer.
program1_kode = "DVFJ60000121"
program1_bærertype = "AH"
program1_bærer = program1_kode + program1_bærertype
program2_kode = "ODRP20002101"
program2_bærertype = "AB"
program2_bærer = "ODRP20002101AB"
program3_kode = program1_kode
program3_bærer = program3_kode + "AA"
programmer = [
{
"kode": program1_kode,
"bærertype": program1_bærertype,
"bærer": program1_bærer
},
{
"kode": program2_kode,
"bærertype": program2_bærertype,
"bærer": program2_bærer
},
{
"kode": program3_kode,
"bærertype": program3_bærer[-2:],
"bærer": program3_bærer
}
]
print(programmer)