Tilbake
20

20 Avansert programmering - Funksjoner og biblioteker

Strukturert programmering med funksjoner, parametre, returverdier og bruk av biblioteker.

60 min
7 oppgaver
FunksjonParameterArgumentReturverdiModul
Du leser den lesevennlige versjonen
Din fremgang i kapitlet
0 / 7 oppgaver

Slutt å gjenta deg selv

Du har skrevet noen programmer nå, og kanskje har du kjent på det: du skriver den samme kodebiten om og om igjen. Beregne et areal her, en temperatur der -- nesten den samme koden, bare med litt andre tall. Det føles tungvint, og det er det. Det finnes et av programmeringens viktigste prinsipper, ofte forkortet DRY: «Don't Repeat Yourself» -- ikke gjenta deg selv.

Verktøyet for å slippe gjentakelsen er funksjonen. I dette kapittelet skal vi lære å bygge programmer av funksjoner -- gjenbrukbare kodeblokker som hver gjør én oppgave. Vi skal se hvordan vi sender informasjon inn i en funksjon med parametre og får svar tilbake med returverdier, hvordan vi gir parametre standardverdier og fleksibilitet, og til slutt hvordan vi kan bruke ferdige biblioteker som andre har skrevet. Tenk på det som å gå fra å lage hvert verktøy fra bunnen, til å ha en velorganisert verktøykasse. Det er forskjellen på rotete kode og kode du faktisk kan vedlikeholde.

Funksjonen -- din egen byggekloss

La oss se hvorfor funksjoner er så nyttige. Tenk deg at du skal regne ut arealet av tre rektangler. Uten funksjoner skriver du areal1 = 5 * 3, areal2 = 7 * 4, areal3 = 10 * 2 -- samme multiplikasjon tre ganger. Definerer du i stedet en funksjon def beregn_areal(lengde, bredde): return lengde * bredde, kan du bare kalle beregn_areal(5, 3) så mange ganger du vil. Funksjoner lar oss gjenbruke kode, organisere store programmer i håndterbare deler, skjule kompleksitet, og teste hver del for seg.

I Python defineres en funksjon med nøkkelordet def, et navn, parametre i parentes, og en kropp som gjerne starter med en docstring -- en forklarende tekst i trippel anførselstegn. La oss lage en som konverterer temperatur: def celsius_til_fahrenheit(celsius): fahrenheit = (celsius * 9/5) + 32; return fahrenheit. Kaller du den med 20, får du 68.0 tilbake. Docstringen er verdt å nevne for seg: den dokumenterer hva funksjonen gjør, kan hentes opp med help(), vises som hint i editoren, og gjør koden vedlikeholdbar.

Ikke alle funksjoner returnerer noe. En funksjon som si_hei(navn) som bare skriver ut en hilsen, returnerer egentlig None. Andre funksjoner returnerer flere verdier på én gang -- som del_med_rest(a, b), som returnerer både kvotient og rest. Kaller du k, r = del_med_rest(17, 5), får du k=3k = 3 og r=2r = 2, fordi 17=53+217 = 5 \cdot 3 + 2. Slik blir funksjonen en fleksibel byggekloss som tar inn og gir tilbake akkurat det du trenger.

📝Oppgave Quiz 1

Å sende informasjon inn

Funksjoner blir virkelig kraftige når vi mestrer hvordan vi sender informasjon inn i dem. Her er det noen skiller å holde styr på. Et parameter er variabelen i selve funksjonsdefinisjonen, mens et argument er den konkrete verdien du sender inn når du kaller funksjonen.

Den vanligste måten er posisjonsargumenter, der verdiene knyttes til parametrene etter rekkefølge. Med def sett_fart(motor, hastighet) betyr sett_fart(1, 75) at motor blir 1 og hastighet 75. Men du kan også bruke navngitte argumenter, der du oppgir parameternavnet eksplisitt: sett_fart(hastighet=50, motor=2) -- da spiller ikke rekkefølgen noen rolle.

En av de nyttigste teknikkene er standardverdier. Du kan gi et parameter en verdi som brukes hvis ikke noe annet oppgis. Tenk deg def blink_led(antall=3, forsinkelse=500). Da kan du kalle blink_led() og få tre blink med 500 ms, blink_led(5) for fem blink, eller blink_led(2, 100) for å overstyre begge. Et praktisk eksempel fra elektronikken: en funksjon som regner ut forstandsmotstanden i en LED-krets, R=(VforsyningVled)/IledR = (V_{forsyning} - V_{led}) / I_{led}. Lar du VledV_{led} ha standardverdi 2 V og IledI_{led} ha 20 mA, blir led_motstand(5) lik (52)/0,020=150 Ω(5 - 2)/0{,}020 = 150\ \Omega uten at du trenger oppgi alt hver gang.

Noen ganger vet du ikke på forhånd hvor mange argumenter som kommer. Da bruker du en stjerne foran parameteret: def summer(*tall) lar deg summere så mange tall du vil -- summer(1, 2, 3) gir 6, og summer(10, 20, 30, 40) gir 100. Funksjonen tilpasser seg det du sender inn.

📝Oppgave Quiz 2

Å stå på skuldrene til andre

Du trenger ikke skrive alt selv. En av de største kreftene i moderne programmering er at du kan bruke kode andre allerede har skrevet og testet grundig. Det kaller vi biblioteker og moduler -- samlinger av ferdige funksjoner og klasser du kan importere inn i ditt eget program.

Det finnes flere måter å importere på. import math henter inn hele matematikkmodulen, og du bruker funksjonene med modulnavnet foran: math.pi, math.sqrt(16). Vil du bare ha noen få funksjoner, skriver du from math import sqrt, pi, og kan da bruke sqrt(25) direkte uten prefiks. Forskjellen er verdt å merke seg: import math holder navnerommet ryddig, mens from math import sqrt gir kortere kode for funksjoner du bruker ofte. Du kan også gi et bibliotek et kortere kallenavn med import numpy as np.

Python kommer med en rik samling innebygde biblioteker: math for matematikk, random for tilfeldige tall, time for tid og forsinkelser, json for datahåndtering, requests for nettforespørsler, numpy for tunge beregninger og serial for seriell kommunikasjon med for eksempel en Arduino. Og du kan til og med lage dine egne moduler -- en fil med funksjoner du kan importere i andre programmer, for eksempel en ohms_lov.py med funksjoner for spenning, strøm, motstand og effekt.

Også Arduino bruker biblioteker, installert via Library Manager i Arduino IDE. Med #include <Servo.h> får du tilgang til ferdige funksjoner for å styre servomotorer, slik at du kan skrive myServo.attach(9) og myServo.write(90) uten å forstå alle de tekniske detaljene under panseret. Det er nettopp det biblioteker handler om: å la deg løse store oppgaver ved å bygge videre på andres arbeid.

📝Oppgave Quiz 3

Oppsummering

Vi har gått fra rotete, gjentakende kode til velorganiserte programmer. Funksjonen er den sentrale byggeklossen: en gjenbrukbar kodeblokk som gjør én oppgave, definert med def, gjerne med en forklarende docstring, og som kan returnere én eller flere verdier -- eller ingen.

Vi lærte å sende informasjon inn gjennom parametre og argumenter: posisjonsargumenter, navngitte argumenter, standardverdier som blink_led(antall=3), og til og med et vilkårlig antall argumenter med en stjerne. Til slutt så vi hvordan biblioteker og moduler lar oss stå på skuldrene til andre -- fra Pythons math og numpy til Arduinos Servo.h -- og hvordan vi kan lage egne moduler som ohms_lov.py. Med funksjoner og biblioteker i verktøykassa kan du bygge store, ryddige programmer som er lette å lese, teste og vedlikeholde.

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.