For løkker

Contents

For løkker#

Gjentakelser og repetisjon dukker ofte opp i både natur, kunst og arkitektur. Og det som er så praktisk er at datamaskinen er spesielt godt egnet til å repetere. Den kan gjøre det samme tusenvis av ganger, ja hundretusenvis av ganger, uten å bli lei.

../_images/pexels-visually-us-2248572.jpg

Natur#

Nærbilde av en kaktus sine pigger (bilde av Visually Us).

../_images/pexels-magda-ehlers-4239915.jpg

Kunst#

Trykk på stoff (bilde av Magda Ehlers).

../_images/pexels-david-underland-3432813.jpg

Arkitektur#

Svart-hvitt bilde av en bygning (bilde av David Underland).

Når vi programmerer, kan vi bruke løkker for å gjenta en bit kode mange ganger uten å skrive den samme koden flere ganger. I Python finnes det to typer løkker: for-løkker og while-løkker. I denne guiden skal vi se på for løkker. Først, la oss se på et eksempel:

 1from turtlethread import Turtle
 2
 3nål = Turtle()
 4with nål.running_stitch(25):
 5    nål.forward(100)
 6    nål.backward(100)
 7    nål.right(60)
 8
 9    nål.forward(100)
10    nål.backward(100)
11    nål.right(60)
12
13    nål.forward(100)
14    nål.backward(100)
15    nål.right(60)
16
17    nål.forward(100)
18    nål.backward(100)
19    nål.right(60)
20
21    nål.forward(100)
22    nål.backward(100)
23    nål.right(60)
24
25    nål.forward(100)
26    nål.backward(100)
27    nål.right(60)
28
29nål.visualise()
Resultat fra koden over. En "stjerne" bestående av seks streker som kommer ut fra samme punkt.

Denne koden kan vi forenkle med en for-løkke

 1from turtlethread import Turtle
 2
 3nål = Turtle()
 4with nål.running_stitch(25):
 5    for stråle in range(6):
 6        nål.forward(100)
 7        nål.backward(100)
 8        nål.right(60)
 9
10nål.visualise()
Resultat fra koden over. En "stjerne" bestående av seks streker som kommer ut fra samme punkt.

Vi ser at den nye koden er mye kortere, og kanskje til og med litt enklere å forstå. Det viktige å forstå på er det som skjer på linje 5-9.

Linje 5:

Sier vi at vi skal repetere den etterfølgende kodeblokka 6 ganger, en gang for hver stråle.

Linje 6-9:

Disse linjene ligger ett innrykk inn sammenliknet med for-løkka som startet på linje 5, og representerer derfor en kodeblokk. Disse tre linjene blir dermed repetert 6 ganger.

Prøv selv:

Modifiser koden over slik at du tegner en stjerne med åtte stråler istedenfor 6 (hint: Da må det være 45° mellom hver stråle).

Klikk her for å se programmet slik det skal være om du har gjort det rett:
 1from turtlethread import Turtle
 2
 3nål = Turtle()
 4with nål.running_stitch(25):
 5    for stråle in range(8):
 6        nål.forward(100)
 7        nål.backward(100)
 8        nål.right(45)
 9
10nål.visualise()
Resultat fra koden over. En "stjerne" bestående av åtte streker som kommer ut fra samme punkt.

Obs

Pass på at koden stemmer med løsningsforslaget over før du går videre.

Mer om range#

Foreløpig har vi hoppet litt over hva selve range-funksjonen gjør. Hvis vi leser koden over står det jo for stråle in range(8). Altså for hver stråle i range(8). Å skrive range(8) blir litt som å be Python generere listen [0, 1, 2, 3, 4, 5, 6, 7]. Vi kan se dette i praksis ved å skrive ut variabelen stråle i terminalvinduet

 1from turtlethread import Turtle
 2
 3nål = Turtle()
 4with nål.running_stitch(25):
 5    for stråle in range(8):
 6        nål.forward(100)
 7        nål.backward(100)
 8        nål.right(45)
 9        print(stråle)
10
11nål.visualise()
0
1
2
3
4
5
6
7
Resultat fra koden over. En "stjerne" bestående av åtte streker som kommer ut fra samme punkt.

Vi ser altså at range-funksjonen skaper en rekke med heltall frem til, men ikke med, avslutningstallet, som i dette tilfellet var 6. Og at stråle blir en variabel som løkker seg igjennom rekka.

Siden stråle blir en variabel, kan vi bruke den i tegningen vår. Hvis vi for eksempel ønsker at strålene våre skal ha ulik lengde, kan vi bruke stråle-variabelen til å sette lengden.

 1from turtlethread import Turtle
 2
 3nål = Turtle()
 4with nål.running_stitch(25):
 5    for stråle in range(8):
 6        nål.forward(stråle)
 7        nål.backward(stråle)
 8        nål.right(45)
 9        print(stråle)
10
11nål.visualise()
0
1
2
3
4
5
6
7
Resultat fra koden over. Syv veldig små streker med ulik størrelse som danner en "ministjerne". Det er nesten umulig å se detaljer siden strekene er så korte.

Men dette var jo ikke det vi ønsket! Her fikk vi jo en bitteliten figur hvor alle stingene ble satt i samme sted. Dette skjedde siden stråle-variabelen tross alt kun har verdier mellom 0 og 5. Vi vil jo ha lengre stråler enn som så. Og for å få til det må vi bruke en annen funksjonalitet til range-funksjonen. range kan nemlig også bestemme hvor tallrekka starter, og hvor stor avstand det skal være mellom hver stråle. Så hvis vi ønsker at den minste strålen skal ha lengde 50, den største strålen skal ha lengde 225 og at det skal være 25 «steg» mellom hvert strålenummer kan vi skrive

 1from turtlethread import Turtle
 2
 3nål = Turtle()
 4with nål.running_stitch(25):
 5    for stråle in range(50, 250, 25):
 6        nål.forward(stråle)
 7        nål.backward(stråle)
 8        nål.right(45)
 9        print(stråle)
10
11nål.visualise()
50
75
100
125
150
175
200
225
Resultat fra koden over. En stjerne bestående av åtte streker med økende størrelse. Den korteste streken peker til høyre, så øker de i lengde jo lengre man beveger seg med klokka.

Det interessante her er på linje 5 igjen. Vi ser at det nå står range(50, 250, 25). Dette betyr altså at vi starter tallrekka på 50, den slutter før 250 og det er 25 steg mellom hvert tall.

Prøv selv:

Modifiser koden over slik at den minste strålen har lengde 100, den lengste har lengde 400 og det er 50 steg mellom hvert strålenummer.

Klikk her for å se programmet slik det skal være om du har gjort det rett:
 1from turtlethread import Turtle
 2
 3nål = Turtle()
 4with nål.running_stitch(25):
 5    for stråle in range(100, 500, 50):
 6        nål.forward(stråle)
 7        nål.backward(stråle)
 8        nål.right(45)
 9        print(stråle)
10
11nål.visualise()
100
150
200
250
300
350
400
450
Resultat fra koden over. En stjerne bestående av åtte streker med økende størrelse. Den korteste streken peker til høyre, så øker de i lengde jo lengre man beveger seg med klokka.

Vi kan bruke denne teknikken for å tegne enda litt kulere stjerner. For eksempel, hvis antall grader vi roterer nåla er 150 vil vi få denne figuren:

 1from turtlethread import Turtle
 2
 3nål = Turtle()
 4with nål.running_stitch(25):
 5    for stråle in range(100, 500, 50):
 6        nål.forward(stråle)
 7        nål.backward(stråle)
 8        nål.right(150)
 9        print(stråle)
10
11nål.visualise()
100
150
200
250
300
350
400
450
Resultat fra koden over. En stjerne bestående av åtte streker med ulik størrelse, tilsynelatende uten mønster om hvilke streker som er korte og lange.

Obs

Hvis du lager mange stråler så kan stingene i sentrum bli for tette til at broderimaskinen klarer å sy.

TODO: lenke til flere eksempler: • Firkantblomst • Snøfnugg • Fibonacci • Evt Solsikkefrø • Evt andre