Funksjoner


Syntaks for funksjoner

En funksjon er en sekvens med kommandoer man kan referere til ved hjelp av et funksjonsnavn. Man kan utføre funksjonen flere ganger ved å kalle den flere ganger.

# Vi definerer en funksjon som heter `eksempel_funksjon`
def eksempel_funksjon():
    print("A")
    print("B")
    print("C")

# Vi kaller eksempel_funksjon to ganger
eksempel_funksjon()
eksempel_funksjon()

Det som utføres i funksjonen må være indentert med riktig antall mellomrom.

def hello():
    print("Skriv ditt navn:")
    name = input()
   print(f"Hei {name}") # Krasjer, mangler et mellomrom

hello()

En funksjon må være definert før den kalles

find_age() # Krasjer, funksjonen find_age er ikke definert enda

def find_age():
    print("Hvilket år ble du født?")
    birth_year = int(input())
    age = 2022 - birth_year
    print(f"Du blir {age} år i år")
Parametre, returverdi og sideeffekter

Funksjoner kan ta input i form av parametre, og kan produsere output i form av både en returverdi og sideeffekter.

# Vi definerer en funksjon som heter `dobling`
# Funksjonen har én parameter (x)
# Funksjonen har returverdi (x * 2)
# Funksjonen har sideeffekt (print skriver til skjermen)
def dobling(x):
    print("Jeg dobler nå", x)
    return x * 2

# Vi utfører noen kall til dobling-funksjonen.
# Verdiene vi gir som input kalles argumenter.
print(dobling(2))
print(dobling(3) + 4)
print(dobling(dobling(2)))

Funksjoner kan ha så mange parametre vi vil. En parameter er en variabel.

def repeat_print(string, repetitions):
    print(string * repetitions)

repeat_print("foo", 3) # skriver ut foofoofoo

def f():
    return 42

print(f()) # skriver ut 42

# Merk! Antall argumenter må matche antall parametre!
repeat_print("bar") # krasjer
print(f(1, 2)) # ville også krasjet

Når koden i en funksjon treffer return, avsluttes funksjonen.

def is_positive(x):
    print("Hello!")   # kjører
    return (x > 0)
    print("Goodbye!") # kjører ikke ("død kode")

print(is_positive(5))  # skriver først Hello, deretter True

Hvis en funksjon ikke utfører en return-setning, returneres den spesielle verdien None.

def a():
    print("Denne funksjonen returnerer None")
    return None

print(a()) # None

def b():
    print("Denne funksjonen har en tom return-setning")
    return
    
print(b()) # None

def c():
    print("Denne funksjonenen har ikke return-setning")

print(c()) # None

Vanlig feil: forveksling av utskrift og returverdi

def cubed(x):
    print(x**3)   # Funksjon uten retur-verdi, kun side-effekt

cubed(2)          # ser ut til å virke
print(cubed(3))   # rart (skriver også ut `None`)
print(2*cubed(4)) # Krasj!

Gjør det heller slik:

def cubed(x):
    return x**3   # Funksjonen har retur-verdi, men ingen side-effekt

cubed(2)          # ser ikke ut til å virke (hvorfor?)
print(cubed(3))   # funker!
print(2*cubed(4)) # funker!
Innebygde funksjoner

Python har mange innebygde funksjoner. Vi har allerede sett print -funksjonen. Noen andre funksjoner det er greit å vite om:

print(int(2.8), int("3")) # int-funksjonen konverterer til heltall
print(float("0.5"), float(1)) # float-funksjonen konverterer til flyttall
print(bool(0), bool(1)) # bool-funksjonen konverterer til True eller False
print("Score: " + str(50)) # str-funksjonen konverterer til streng

print(len("Hurra")) # len gir oss antall symboler i strengen/teksten
print(abs(-3)) # absolutt-verdi
print(max(2, 3)) # maksimum
print(min(2, 3)) # minimum

Noen funksjoner er innebygd i Python, men likevel ikke umiddelbart tilgjengelig; de må importeres først.

print(math.factorial(4)) # vi håper på 4*3*2*1 = 24
# krasjer fordi math ikke er importert
import math
print(math.factorial(4)) # 24
Skop

En variabel eksisterer i ett skop basert på hvor variabelen ble definert. Hver funksjon har sitt eget skop; variabler som er definert i dette skopet kan ikke nås utenfra.

def foo(x):
    print(x)

foo(2) # skriver ut 2
print(x) # Krasjer, siden variabelen x kun var definert i foo sitt skop
def bar():
    y = 42
    print(y)

bar() # skriver ut 42
print(y) # Krasjer, siden variabelen y kun var definert i bar sitt skop

Det samme variabelnavnet kan eksistere i ulike skop. Men selv om variablene heter det samme, er de helt uavhengig av hverandre.

def f(x):
    print("Vi er i f, x =", x)
    x += 5
    return x

def g(x):
    y = f(x*2)
    print("Vi er i g, x =", x)
    z = f(x*3)
    print("Vi er i g, x =", x)
    return y + z

print(g(2))

Det kan eksistere flere skop samtidig når koden kjører.

x = "x i globalt skop"
y = "y i globalt skop"

def f():
    y = "y i lokalt skop"
    z = "z i lokalt skop"
    print(x)
    print(y)
    print(z)

f()

Hold tungen rett i munnen og regn ut hva svaret blir før du kjører koden under. Ta notater på papir for å holde styr på hva som foregår.

def f(x):
    print("Vi er i f, x =", x)
    x += 7
    return round(x / 3)

def g(x):
    x *= 10
    return 2 * f(x)

def h(x):
    x += 3
    return f(x+4) + g(x)

print(h(f(1)))