Tilbake
3.4
Funksjoner og modularitet

3.4 Funksjoner og modularitet

Definere og bruke funksjoner, parametre og returverdier for gjenbrukbar kode.

55 min
6 oppgaver
FunksjonerParametreReturverdierModulariseringScope
Du leser den lesevennlige versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

Når koden vokser seg uoversiktlig

De første programmene dine var kanskje korte og greie å lese. Men når et program vokser til hundrevis av linjer, blir det fort et villnis. Tenk deg en bok uten kapitler -- bare én lang tekst. Det er nettopp dette funksjoner løser. En funksjon er en navngitt blokk med kode som løser én bestemt oppgave, og som du kan bruke om og om igjen.

Du har faktisk allerede brukt funksjoner: print(), input() og range() er innebygde funksjoner. Nå skal du lage dine egne. Gevinsten er stor. Du får gjenbruk -- skriv koden én gang, bruk den mange ganger. Du får oversikt, fordi programmet blir lettere å lese. Du får enklere feilsøking, fordi feil ligger isolert i hver blokk. Og du legger til rette for samarbeid, der ulike personer kan jobbe med hver sin funksjon.

Å lage og bruke en funksjon

Vi lager en funksjon med nøkkelordet def, etterfulgt av navnet og parenteser. Skriver du def hilsen(): og rykker inn noen print-linjer under, har du laget en funksjon. Men den gjør ingenting før du kaller den -- altså skriver hilsen(). Da kjøres koden inni, og du kan kalle den så mange ganger du vil. Husk én regel: funksjonen må defineres før den kalles, for Python leser koden ovenfra og ned.

Det virkelig kraftige skjer når funksjoner tar imot og gir tilbake data. Parametre er verdier du sender inn, og returverdier er svaret funksjonen gir tilbake med return. Skriver du def adder(a, b): return a + b, er a og b parametre. Når du kaller adder(3, 5), er 3 og 5 argumenter, og funksjonen returnerer 8.

Dette egner seg perfekt for elektrofag. En funksjon beregn_motstand(spenning, strom) kan returnere R=U/IR = U/I. Kaller du den med 12 V og 0,5 A, får du 24 Ω24\ \Omega; med 5 V og 0,1 A får du 50 Ω50\ \Omega. En lur detalj: hvis strømmen er null, kan du la funksjonen returnere None for å unngå deling på null. Og merk en vanlig felle: hvis en funksjon bare skriver ut et resultat med print() men mangler return, så returnerer den i virkeligheten None. Det er forskjell på å vise et tall på skjermen og å gi det tilbake til programmet.

📝Oppgave Quiz 1

Standardverdier og hvor variabler bor

Noen ganger vil du gjøre funksjoner mer fleksible. Med en standardverdi (default) kan en parameter ha en ferdig verdi som brukes hvis du ikke oppgir noe. Lager du def hilsen(navn, sprak="norsk"), kan du kalle hilsen("Kari") og få den norske hilsenen, eller hilsen("Kari", "engelsk") for å overstyre. Én regel gjelder: parametre med standardverdi må komme etter dem uten. Et nyttig elektroeksempel er en funksjon som beregner motstand og kan vise svaret i ohm eller kilo-ohm avhengig av en enhet-parameter med standardverdi "ohm".

Den siste store ideen er scope -- altså hvor en variabel finnes. En lokal variabel opprettes inne i en funksjon og lever bare der. Prøver du å lese den utenfor, får du en feil. En global variabel opprettes utenfor funksjoner og kan leses overalt. Men her er en felle å være obs på: skriver du x = 10 inne i en funksjon mens det finnes en global x = 5, lager du i virkeligheten en ny lokal x som skygger for den globale. Funksjonen skriver ut 10, men utenfor er x fortsatt 5.

Den beste praksisen er å tenke på funksjoner som selvstendige enheter: data kommer inn gjennom parametre, og resultater går ut gjennom return. Unngå å endre globale variabler inne i funksjoner -- det gjør koden vanskelig å forstå og feilsøke. Med tre rene funksjoner kan du for eksempel regne ut effekt på tre måter: P=UIP = U \cdot I, P=RI2P = R \cdot I^2 og P=U2/RP = U^2/R. Med U=12U = 12 V, I=2I = 2 A og R=6 ΩR = 6\ \Omega gir alle tre samme svar: 122=2412 \cdot 2 = 24, 622=246 \cdot 2^2 = 24 og 122/6=144/6=2412^2/6 = 144/6 = 24 watt.

📝Oppgave Quiz 2

Oppsummering

Funksjoner er verktøyet som gjør store programmer håndterbare. Med def lager du navngitte, gjenbrukbare blokker. Parametre og argumenter lar funksjoner ta imot data, og returverdier med return sender et resultat tilbake -- husk at en funksjon uten return gir None.

Standardverdier gjør funksjonene fleksible, men må stå etter de vanlige parametrene. Scope avgjør hvor variabler lever: lokale variabler finnes bare inne i funksjonen, globale utenfor, og en lokal variabel kan skygge for en global. Den beste vanen er å sende data inn via parametre og ut via return, slik vi så da tre ulike effektformler -- P=UIP = U \cdot I, P=RI2P = R \cdot I^2 og P=U2/RP = U^2/R -- alle ga 24 watt for de samme verdiene.

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.