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.
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()
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()
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).
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
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
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
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
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
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