Gjøre noe for mange#

Læringsmål#

Nå skal vi introdusere forløkker.

Introduksjon#

For-løkker hjelper oss å gjøre samme ting for flere tilfeller eller flere ganger. På norsk kunne vi si for flere ting gjør handling, for eksempel for alle barna gi dem en oppmuntring. På nesten-pythonsk kunne vi si

 for hvertbarn in barna:
    oppmuntre(hvertbarn)

Her er barna en variabel som er en rekke med barn. hvertbarn er en variabel. Det som står med innrykk blir gjort en gang for hvert av barna.

Representasjoner#

Ord#

På norsk sier vi noen ganger

  • For hver elev må du gi dem en bok.

  • Hver dag må du spise frokost.

  • Alle studenter fortjener et kompliment hver dag! Dette likner på for-løkker. I alle tilfeller har vi en samling objekt (elever, dager, studenter) og gjør noe for hver av objektene.

Ordet løkke kommer vel av at for-løkka på en måte går rundt og rundt, en gang for hvert objekt i samlingen.

W3Schools codegame#

Gå til w3schools codegame og spill nivå 22‒27.

Python#

Se på følgende eksempel

noentall = [1,2,3,5,8,13]
print("noentall er en variabel med verdi " + str(noentall) + " som har typen " + str(type(noentall)))
for tallet in noentall:
    print("Tallet er " + str(tallet));
    print("og har typen " + str(type(tallet)))
noentall er en variabel med verdi [1, 2, 3, 5, 8, 13] som har typen <class 'list'>
Tallet er 1
og har typen <class 'int'>
Tallet er 2
og har typen <class 'int'>
Tallet er 3
og har typen <class 'int'>
Tallet er 5
og har typen <class 'int'>
Tallet er 8
og har typen <class 'int'>
Tallet er 13
og har typen <class 'int'>

Vi definerer først en variabel noentall som har har en liste av tall som verdi. For sikkerhets skyld skriver vi ut denne.

Så skriver vi en for-løkke. I en forløkke er det noe som skal gjøres flere ganger. Dette “noe” er det som er rykket inn. I Python er inntrykk viktig.

Dette skal gjøres én gang for hvert element i noentall. For hver runde i løkka får variabelen tallet en verdi fra noentall.

Øvelse: Legg til en linje i programmet over sånn at det også skriver ut det dobbelte av hvert tall.

Det er ofte kjedelig å manuelt skrive inn en liste over mange tall. Til det har vi en ferdig funksjon: range(). For eksempel gir range(10) oss en liste over de ti første heltallene.

førsteti = range(10)
print("førsteti er en variabel med verdi " + str(førsteti) + " som har typen " + str(type(førsteti)))
for tallet in førsteti:
    print("Tallet er " + str(tallet));
førsteti er en variabel med verdi range(0, 10) som har typen <class 'range'>
Tallet er 0
Tallet er 1
Tallet er 2
Tallet er 3
Tallet er 4
Tallet er 5
Tallet er 6
Tallet er 7
Tallet er 8
Tallet er 9

Øvelse: Skriv et tall som skriver ut de fjorten første partallene (de første partallene er altså det dobbelte av de første heltallene).

Turtle#

Forløkker kan gjerne brukes i Turtle også. Turtle er godt egnet til øvelser:

Skriv et program som ti ganger gjør følgende: Går 10 framover og vender seg ti grader mot venstre

Skriv et program som ti ganger gjør følgende: Går 10 framover og vender seg hundre og ti grader mot venstre

Lag en åttekantet stjerne.

Gå til Trinket.com og gjør oppgavene undre Python→For loops.

Søk på Google etter bilder av turtle for loop.

GeoGebraScript#

Repeat and Sequence

Sammenheng med algebra#

Dette er orienteringsstoff for interesserte:

For-løkker kan sammenliknes med operatoren “for alle” \(\forall\). Det er likevel ofte sånn at forløkker i programmering handler om å gjøre noe, mens \(\forall\) vanligvis handler om noe som er sant eller ikke. Sånn sett kan \(\forall\) heller sammenliknes med Python-funksjonen map().

Andre programmeringsspråk#

Dette er orienteringsstoff for interesserte:

I mange andre programmeringsspråk er innrykk mindre viktig: Her er et eksempel fra programmeringsspråket R (fra w3schools)

frukter <- list("apple", "banana", "cherry")

for (frukt in frukter) {
  print(frukt)
}

I noen språk (f.eks. Java) heter tilsvarende konstruksjon foreach.

I en del andre språk (f.eks. C) finnes en gammeldags for-variant som på en måte likner på vår, men som på en annen måte er veldig forskjellig. Denne er mer tilpasset hvordan datamaskinen fungerer enn hvordan mennesker tenker; derfor er den lett å oversette til datamaskinens strømledninger, men dårlig til å modellere. Den bør altså ikke brukes. Her er likevel et eksempel fra programmeringsspråket C.

int i;

for (i = 0; i < 5; i++) {
  printf("%d\n", i);
}

Datatyper#

Lister og sekvenser#

Vi har så langt sett på datatypene int, bool og str. Disse har én verdi. Typen List kan ha en rekke av verdier:

listami = ["eple", "pære", "banan"]
print(listami)
['eple', 'pære', 'banan']

Vi kan finne enkeltelementer i lista:

print(listami[0])
print(listami[2])
eple
banan

Vi kan gjøre ting for alle elementene i lista:

for l in listami:
    print("l er nå " + l)
l er nå eple
l er nå pære
l er nå banan

For mer informasjon se w3schools.

Mønstre#

Funksjonen range()#

Noen ganger har vi behov for å lage en tallrekke. Det kan vi lage med funksjonen range:

for x in range(4):
    print("x er nå " + str(x))
x er nå 0
x er nå 1
x er nå 2
x er nå 3

For mer forklaring og eksempler, se w3schools. Man kan også skrive ut en tallrekke som begynner med noe annet enn 0, eller en tallrekke som hopper i anre trinn enn 1.

Sammenlikn også med følgende kode, hvor vi skriver inn verdiene selv (uten å bruke range):

for y in [0,1,2,3]:
    print("y er nå " + str(y))
y er nå 0
y er nå 1
y er nå 2
y er nå 3

Lag et program som skriver ut de 10 første heltallene.

For i for#

Noen ganger har vi forløkker inne i hverandre. Se på følgende program:

for i in range(2):
    print("NY YTRE LØKKE i har verdien " + str(i))
    for j in range(3):
        print("  Ny indre løkke j har verdien " + str(j))
        print("  i + j = " + str(i+j))
NY YTRE LØKKE i har verdien 0
  Ny indre løkke j har verdien 0
  i + j = 0
  Ny indre løkke j har verdien 1
  i + j = 1
  Ny indre løkke j har verdien 2
  i + j = 2
NY YTRE LØKKE i har verdien 1
  Ny indre løkke j har verdien 0
  i + j = 1
  Ny indre løkke j har verdien 1
  i + j = 2
  Ny indre løkke j har verdien 2
  i + j = 3

Kopier gjerne programmet til din egen fil, så du kan forandre det og eksperimentere det.

Legg merke til at vi har godt med print-setninger: Det hjelper oss å forstå hva som skjer. Noen ganger føler man at man har for i kål, fordi man har mistet oppskriften, og da er det ofte lurt å legge inn flere såkalte testutskrifter. Man kan ta dem bort (eller kommentere dem bort) senere.

Skjønner du hva som skjer? For hvert element i den ytre løkka går alle verdiene i den indre løkka. Resultatet blir på en måte en løkke i en løkke TODO: Tegne grafisk eller noe todimensjonalt TODO: Tegne grafisk.

Oppgave: Skriv et program som skriver ut gangetabellen. Det kan være en hjelp å skrive ut mange testuskrifter. Om du ikke ønsker at hver print-instruksjon skal skrive ut på en ny linje, kan du prøve print("noe", end="") som ikke skriver ut en ny linje etter seg.

Løkke som vedlikeholder verdier#

Flyttet til dokumentet om While.

Når bruker vi forløkker?#

Ofte. Forløkker brukes når vi skal modellere en ting som skjer mange ganger, for mange hendelser, for mange objekt e.l.