Oppskrifter (funksjoner)#

Læringsmål#

Nå skal vi introdusere funksjoner. Det hjelper oss å modellere inni-algoritmer også kalt deloppgaver.

Du skal kunne

  • Definere (lage) en funksjon med def. Dette lager en “jobboppskrift”.

  • Bruke funksjonen

  • Se når vi kan bruke funksjoner til å modellere virkeligheten

  • Finne ferdige funksjoner til oppgaver

Introduksjon#

  • Når vi skal addere to brøker, må vi noen ganger finne felles nevner. “Å finne felles nevner” er inni-algoritme (deloppgave) i å addere brøker.

  • Når vi skal gå ut med søpla, må vi først åpne en skapdør. “Å åpne skapdøra” er en inni-algoritme i å gå ut med søpla. De fleste oppgaver i livet består av inni-oppgaver. Dette modelleres i Python med funksjoner.

Representasjoner#

Ord#

Funksjoner kalles på norsk deloppgaver, inni-algoritmer, underoppgaver etc. Flere av ordene tyder på at vi ser funksjoner inni hverandre eller under hverandre. I andre programmeringsspråk kalles de også metoder, prosedyrer eller subrutiner.

En definisjon på en funksjon kan også kalles jobbinstruks, oppskrift eller kropp (body).

Argument (som vi skal komme til) kalles også parameter, selv om noen bruker ordene litt forskjellig. Argumentene er små variable som bare gjelder inne i funksjonen. Dette er informasjon *inn til funksjonen.

Returverdi (som vi skal komme til) er svar ut av funksjonen.

Scratch#

I Scratch kan man lage egne blokker. Denne funksjonaliteten har fargen rød. Se “My Blocks” nederst til venstre.

Egne blokker kan sammenliknes med funksjoner; de

  • kjører et antall andre blokker

  • “er” et antall andre blokker

Blokker i scratch har tilmed argumenter/parametre. Jeg har riktignok ikke klart å returnere verdier men har hørt noe som heter Reporter som skal kunne gjøre det. Messages bør også kunne brukes til noe av det samme.

Python#

Definisjon#

Funksjoner blir først definert, for eksempel

def minFunksjon():
    print("nå utføres minFunksjon")
    print("litt til")

det kommer ikke noe ut av definisjonen. Det kan være litt forvirrende når vi ikke ser noe resultat av definisjonen. Resultatet er bare at Python har fått et nytt navn på en ny oppskrift.

Bruk#

Senere kan funksjoner brukes, for eksempel

minFunksjon()
nå utføres minFunksjon
litt til

Regneark#

En formel likner på en funksjon.

Viktige funksjoner (som er undervurderte):

Python TODO hit#

Definisjon og bruk, uten argumenter#

En Python-funksjon blir definert med nøkkelordet def. Etter def følger navnet på funksjonen, parenteser og et kolon. De neste linjene, så langt det er rykket inn, er det som utføres av funksjonen. Det kalles kroppen.

Et eksempel er en funksjonen skrivutlitt som skriver ut en tekst:

def skrivutlitt():
    print("Skriv ut litt")
    print("til")

Dette bare definerer funksjonen, men kjører den ikke. For kjøring skriver vi rett og slett navnet (med parentesene):

skrivutlitt()
Skriv ut litt
til

Definisjon og bruk, med argumenter inn#

Før vi går videre skal vi introdusere argumenter. Argumenter er informasjon som blir gitt inn i funksjonen. Se på følgende eksempel:

def skrivHilsen(fornavn, etternavn):
    print("Hei på deg, " + fornavn + " " + etternavn)
    
skrivHilsen("Volodomyr", "Zelenskyy")
skrivHilsen("Maria", "Ressa")
skrivHilsen("Dmitry", "Muratov")
Hei på deg, Volodomyr Zelenskyy
Hei på deg, Maria Ressa
Hei på deg, Dmitry Muratov
Pappeske
Denne funksjonen har to argument, som heter ``fornavn`` og ``etternavn``. Når funksjonen kjøres må vi gi verdier til disse. Her har vi kjørt funksjonen tre ganger, med forskjellige verdier. I første kjøring får ``fornavn`` verdien ``Volodomyr``. Så kjøres kroppen (som her består av bare én linje), og ``fornavn`` og ``etternavn`` får de nødvendige verdier.

Argumentene er egentlig variable (pappesker) hvor man kan legge verdier og hente verdier. Argumentene får i utgangspunktet verdiene som er angitt når funksjonen blir kalt. Disse variablene er lokale, det vil si at de bare finnes så lenge funksjonen blir kjørt. Vi kan altså ikke snakke om fornavn etter at skrivHilsen er ferdig.

Følgende kode har flere feil. Rett dem, kjør funksjonen og bruk den til å finne summen av 2 og 3.

def addere(addend1, addend2):
    print("Testutskrift: addend1=" + str(addend1) + " og addend2=" + addend2)
    print("Summen av " + str(addend1) + " og " + str(addend1) + " er " + str(addend1 * addend2))

Skriv en funksjon som adderer tre tall.

Skriv en Python-funksjon som tar to tall som argument og skriver ut det største. Du kan ha en if-setning inne i funksjonen; da trenger du to innrykk! I Python er det lov til å skrive ting som a > b.

Skriv en Python-funksjon som tar tre tall som argument og skriver ut det største.

Skriv en funksjon som tar et tall n som argument. Funksjonen skal skrive ut alle tall fra 0 til n. Du vil trenge en for-løkke inne i funksjonen; du vil sannsynligvis også trenge range(n).

Returverdier#

Funksjoner slutter når oppskriften er ferdig eller når de kommer til return. Da gir de kontrollen tilbake til sin oppdragsgiver som kalte dem. De kan også gi tilbake en returverdi (svar).

def leggeSammen(a, b):
    svar = a + b
    return(svar)

s = leggeSammen(1, 2)
print("s =", s)
print("en linje:", leggeSammen(3,4))
s = 3
en linje: 7

En funksjon kan faktisk levere tilbake flere verdier også, selv om det er litt mindre vanlig.

def person(a):
    navn = "Johannes"
    alder = a + 1
    return navn, alder

navnet, alder = person(40)
print("Navn=", navnet)
print("Alder=", alder)
Navn= Johannes
Alder= 41

Turtle#

BUrde hatt noen oppgaver her.

Hva skjer når en funksjon blir kjørt?#

La oss si vi har følgende program:

def innenfor(a, b):
    svar = a + b;
    print("Nå kjøres 'innenfor'.  Svaret er " + str(svar))
    return(svar)

førstesvar = innenfor(2, 3)
andresvar = innenfor(4, 5)
print("Førstesvar er " + str(førstesvar))
Nå kjøres 'innenfor'.  Svaret er 5
Nå kjøres 'innenfor'.  Svaret er 9
Førstesvar er 5

Det som skjer, er følgende:

Først defineres funksjonen innenfor. Den har to argument: a og b. Den har en kropp (jobbinstruksjon) på tre linjer; kroppen er det som har innrykk. Så langt har det ikke kommet noe på skjermen.

Så kommer vi til linja førstesvar = innenfor(2, 3). Først kjøres funksjonen innenfor. En kjøring av en funksjon er flere ting:

  1. Kontrollen går til funksjonen. Det vil si at kontrollen gies til funksjonen innenfor. Vi kan tenke oss at kontrollen hopper opp til definisjonen.

  2. Argumentene får verdi. Argumentene a og b er egentlig variable (pappesker) som bare finnes mens funksjonen blir kjørt. De får verdiene 2 og 3.

  3. Funksjonen kjører sin “jobbinstruks”. Nå er kontrollen i innenfor-funksjonen, som utfører sin jobbinstruks. Variabelen (pappesken) svar er også lokal, altså at den bare finnes i innenfor. Vi henter verdiene fra a og b, adderer dem og legger resultatet inn i svar. Neste linje er en print-linje som skriver til skjermen.

  4. Funksjonen gir tilbake kontrollen. Når en funksjon kommer til return i sin oppskrift (eller oppskriften er slutt) returnerer den kontrollen. En funksjon gir alltid kontrollen tilbake sin til oppdragsgiver. Funksjonen kan også gi tilbake et svar til sin oppdragsgiver.

Svaret fra innenfor blir lagt i variabelen (pappesken) førstesvar.

Så kjøres innenfor en gang til, med andre parametre. En oppskrift kan brukes mange ganger! Denne gangen får a verdien 4. Resultatet fra denne kjøringen blir lagt i andresvar.

Til sist kalles funksjonen print med teksten "Førstesvar er 5".

Mønstre#

Funksjoner som er ferdigdefinerte#

Vi har sett på flere ferdigdefinerte funksjoner allerede:

  • print() skriver ut en tekst til skjermen

  • str() gjør et tall om til en tekst (f.eks. tallet 2 til teksten "2")

  • round() (finn ut hva denne funksjonen gjør ved å søke på nettet).

Funksjoner med andre ting inne i seg#

En funksjon kan ha for-løkker, if-setninger, funksjonskall og mange andre ting inne i seg. Her er et eksempel:

def multiplikasjonMedLittEkstra(a, b):
    print("NÅ BEGYNNER FUNKSJONEN  a="+ str(a) + " b=", str(b))
    if(a < 0):
        print("a er mindre enn 0:", a)
    if(b < 0):
        print("b er mindre enn 0:", b)
    for i in range(a, b):
        print("i forløkke: i=", i)
        print("    dette er også i for-løkke")
    return;

multiplikasjonMedLittEkstra(2, 5)
multiplikasjonMedLittEkstra(-2, 1)
multiplikasjonMedLittEkstra(-2, -1)
NÅ BEGYNNER FUNKSJONEN  a=2 b= 5
i forløkke: i= 2
    dette er også i for-løkke
i forløkke: i= 3
    dette er også i for-løkke
i forløkke: i= 4
    dette er også i for-løkke
NÅ BEGYNNER FUNKSJONEN  a=-2 b= 1
a er mindre enn 0: -2
i forløkke: i= -2
    dette er også i for-løkke
i forløkke: i= -1
    dette er også i for-løkke
i forløkke: i= 0
    dette er også i for-løkke
NÅ BEGYNNER FUNKSJONEN  a=-2 b= -1
a er mindre enn 0: -2
b er mindre enn 0: -1
i forløkke: i= -2
    dette er også i for-løkke

Funksjoner som kaller funksjoner#

Det er svært vanlig at funksjoner kaller andre funksjoner. Se på følgende funksjoner:

def skrivFornavn():
    print("Nå er jeg i skrivFornavn()")
    return("Jerome")
    
def skrivEtternavn():
    print("Nå er jeg i skrivEtternavn()");
    return("Bruner")

def skrivHeleNavn():
    print("skrivHeleNavn() start")
    svar = skrivFornavn() + " " + skrivEtternavn();
    print("skrivHeleNavn() har satt svar til " + svar)
    return(svar)

print("----- KALLER BARE DEN FØRSTE")
skrivFornavn();
print("----- KALLER HELE")
heleNavn = skrivHeleNavn()
print("hele navnet ble " + heleNavn)
----- KALLER BARE DEN FØRSTE
Nå er jeg i skrivFornavn()
----- KALLER HELE
skrivHeleNavn() start
Nå er jeg i skrivFornavn()
Nå er jeg i skrivEtternavn()
skrivHeleNavn() har satt svar til Jerome Bruner
hele navnet ble Jerome Bruner

Arbeidskrav#

Her er kommentarer til arbeidskrav MA102 nr 1 2023

Hovedideen

Når bruker vi funksjoner?#

Hele tida.

Vi bruker funksjoner

  • Når vi skal modellere deloppgaver

  • Når vi skal gjøre samme oppgave flere ganger; i stedet for å skrive samme kodelinjer flere ganger skriver vi dem inn i én funksjon og kaller den flere ganger

Å finne funksjoner på nett#

Ofte lager vi funksjoner selv. Ofte finner vi også funksjoner på nett. Det er svært nyttig å kunne søke etter funksjoner i dokumentasjon eller på Google. Noen ganger er det også aktuelt å få chatbot eller andre mennesker til å programmere for seg.

Finn en innebygget funksjon for gjennomsnitt. Øverst i programmet må det sannsynligvis stå from statistics import *. Det kan tenkes du må bruke lister eller andre sekvenser.

Lag en egen funksjon gjennomsnitt. Du kan komme til å trenge funksjonene sum() og len() — finn ut hva de gjør.

Pedagogiske grep#

Skuespill.#

Gjenoppfrisking fra 2023-01-02:

I#

def frokost():
        print("God morgen! Hva vil du ha til frokost?")
        mat = input()
        print("Her er din " + mat + " Kos deg!")
        
#frokost()

Roller:

  • Menneske (bruker)

  • Hovedprogram

  • frokost

  • print

  • input

  • mat (variable kan også være bare steder å lagre informasjon, f.eks. en eske eller ark å skrive verdier på)

II#

sources/programming/images/static/skuespill2.jpg
Her var variablene ikke representert med skuespillere, men med firkanter på tavla hvor vi skrev verdier.

Koble med matematikk#

Funksjoner for å utføre matematiske algoritmer, f.eks.

  • Multiplikasjon ved gjentatt addisjon

  • Brøkregning

Fordeler med funksjoner#

Gjenbrukbarhet#

Reusability

Oversikt#

Modellering#

Oppgaver#

Når du lager en funksjon er det sunt å teste den et par ganger.

  • Lag en funksjon som tar to tall som argument, og returnerer gjennomsnittet.

  • Lag en funksjon som tar tre tall som argument, og returnerer gjennomsnittet.

  • Lag en funksjon som tar to tall som argument, og returnerer det høyeste. Det er altså to muligheter: Enten at det første er høyest (hva skal du gjøre hvis det er høyest?) eller at det andre er høyest.

  • Lag en funksjon som tar tre tall som argument, og returnerer det høyeste. Her finnes flere gode løsningsmetoder; noen involverer en if inne i en if (den innerste skal altså ha to innrykk), andre involverer logisk OG.

Lambda#

TODO

TIlmed i Excel nå.

Aspekt#

Inni-funksjoner.