Du har skrevet den samme kodeblokken tre ganger i programmet ditt. Kanskje det er en beregning, en formatert utskrift, eller en sjekk som gjentar seg. Hver gang du skal endre noe, må du huske å gjøre det på alle tre stedene. Glemmer du ett, får du en bug som er vanskelig å finne. Funksjoner i Python løser dette ved å la deg skrive koden én gang og bruke den overalt.
Lag din første funksjon i Python
En funksjon starter med nøkkelordet def, etterfulgt av et navn, parenteser og kolon. Alt som er rykket inn under hører til funksjonen:
def si_hei():
navn = input("Hva heter du? ")
print(f"Heisan, {navn}!")
Denne koden gjør ingenting alene. Du har bare fortalt Python hva funksjonen inneholder. For å kjøre den, kaller du funksjonen ved navn:
si_hei()
Nå spør programmet etter navnet ditt og skriver ut en hilsen. Trenger du hilsenen to ganger? Skriv si_hei() to ganger. Ingen kopiert kode, ingen dobbelt vedlikehold.
Du har allerede brukt funksjoner i Python uten å tenke over det. print(), len(), type() og input() er alle innebygde funksjoner. De følger nøyaktig samme mønster: du sender inn en verdi i parentesene, og funksjonen gjør noe med den. Å lage egne funksjoner handler om å bygge de samme byggesteinene, tilpasset dine behov.
Funksjoner med parametere
Funksjoner blir nyttigere når de kan jobbe med forskjellige data. Det gjør du ved å legge til parametere i parentesen:
def legg_sammen(a, b):
print(a + b)
Kaller du legg_sammen(5, 4), får du 9. Kaller du legg_sammen(10, 20), får du 30. Samme funksjon, ulike tall. Parameterne a og b er variabler som kun lever inni funksjonen.
Prøver du å kalle legg_sammen() uten tall, gir Python en TypeError. Den forteller deg at a og b mangler. Feilmeldingen er presis nok til at du ser hva som må rettes.
Returner verdier med return
Å printe resultatet direkte er greit for testing, men i et større program trenger du verdien videre. Da bruker du return:
def legg_sammen(a, b):
return a + b
resultat = legg_sammen(5, 4)
print(resultat)
Forskjellen er avgjørende. Med print vises tallet på skjermen, men forsvinner. Med return får du verdien tilbake og kan lagre den i en variabel, bruke den i beregninger, eller sende den inn i en annen funksjon.
Har funksjonen din ingen return-setning, returnerer Python None automatisk. Det er ikke en feil, men det betyr at funksjonen ikke gir deg noe å jobbe med.
Variabler lever bare inni funksjonen
Oppretter du en variabel inne i en funksjon, finnes den bare der. Dette kalles scope:
def min_funksjon():
x = 10
print(f"Inne i funksjonen: {x}")
x = 20
min_funksjon()
print(f"Utenfor funksjonen: {x}")
Resultatet blir "Inne i funksjonen: 10" og "Utenfor funksjonen: 20". De to x-ene er helt uavhengige. Funksjonen endrer ikke variabelen utenfor, og variabelen utenfor påvirker ikke funksjonen.
Dette er en styrke, ikke en begrensning. Når funksjonen har sitt eget scope, kan du gjenbruke den uten å bekymre deg for at den roter til resten av programmet.
Funksjoner som gjør mer enn én ting
En funksjon kan inneholde logikk, løkker og alt annet du kjenner fra Python. Her er en funksjon som returnerer absoluttverdien av et tall:
def absoluttverdi(tall):
if tall < 0:
return tall * -1
return tall
Legg merke til at return avslutter funksjonen umiddelbart. Treffer Python den første return-setningen inne i if-blokken, hopper den aldri til den neste. Du trenger derfor ikke en else. Mange erfarne Python-utviklere foretrekker denne stilen fordi den gir mindre innrykk og lettere lesbar kode.
Gi funksjoner beskrivende navn
Et godt funksjonsnavn forteller hva funksjonen gjør, uten at du trenger å lese koden inni. Sammenlign def f(x) med def beregn_absolutt_verdi(tall). Den andre versjonen er selvforklarende.
Python-konvensjonen er å bruke små bokstaver med understrek mellom ord: hent_bruker, sjekk_passord, beregn_total. Unngå forkortelser som calc_tot. Koden skrives én gang, men leses mange ganger. Et navn som sparer fem tastetrykk koster deg minutter med forvirring tre måneder senere.
Tre vanlige feil med funksjoner i Python
Glemte parenteser ved kall. Skriver du si_hei uten parenteser, refererer du til funksjonsobjektet i stedet for å kjøre det. Python gir ingen feilmelding, men ingenting skjer heller.
Blander print og return. En funksjon som printer resultatet i stedet for å returnere det, gjør det umulig å bruke verdien videre. Bruk return som standard, og print bare der du faktisk vil vise noe på skjermen.
Kaller funksjonen før den er definert. Python leser koden ovenfra og ned. Står funksjonskallet over def-blokken, får du en NameError. Definer først, kall etterpå.
Neste steg
Funksjoner i Python blir enda kraftigere når du bruker parametere og returverdier bevisst, med standardverdier og nøkkelordargumenter. Vil du sende inn et ukjent antall verdier, viser *args og **kwargs deg hvordan. Og trenger du enkel feilhåndtering inne i funksjonene dine, er try og except neste naturlige steg. Du kan også lese mer om funksjoner i Python-dokumentasjonen.
Denne videoen er hentet fra kurset Python for nybegynnere på Utdannet.no. I det fulle kurset lærer du også løkker, datastrukturer og objektorientert programmering.




