2. Code herhalen met loops#

Heb je het werken met variabelen door? Mooi, dan kunnen we nu weer verdergaan met het leukere programmeerwerk!

2.1. While loops#

Maak in Mu editor weer een nieuw bestand door op de knop New te klikken. Kopieer en plak de onderstaande code in het bestand en sla het op als turtle_while.py.

turtle_while.py#
1import turtle
2
3tony = turtle.Turtle()
4
5zijde = 0
6while zijde < 4:
7    tony.fd(100)
8    tony.lt(90)
9    zijde = zijde + 1

Run de code om het resultaat te bekijken. Snap je hoe deze code werkt? Het Python keyword while in regel 6, kun je vertalen als terwijl of zolang. En het < symbool betekent kleiner dan. Dus regel 6 kun je lezen als:

Zolang de waarde van zijde kleiner is dan 4, doe het volgende:

De regels 7, 8 en 9 zijn ingesprongen. Dat is belangrijk! Daardoor weet Python dat die drie regels binnen de ‘while lus’ vallen. Zolang aan de voorwaarde zijde < 4 is voldaan, voert Python deze regels uit. Regel 9 zorgt ervoor dat de waarde van zijde met 1 wordt verhoogd. Na het uitvoeren van deze regel, springt Python terug naar regel 6 om de voorwaarde zijde < 4 opnieuw te checken.

Klinkt moeilijk? Misschien helpt het dan om de while loop echt in actie te zien. Maak Opdracht 01 hieronder om te leren over de ‘debugging mode’ van Mu-editor en te zien hoe de while loop wordt uitgevoerd.

Opdracht 01

Klik op regel 6 in turtle_while.py met de muiscursor in het grijze stukje rechts naast het regelnummer 6 om een zogenoemd breakpoint te plaatsen.

../_images/debug_breakpoint.png

Klik daarna op Debug bovenin de knoppenbalk.

../_images/debug_debug_button.png

Nu start Mu editor de uitvoering van de code, maar pauzeert op regel 6, waar je zojuist het breakpoint plaatste. Gebruik de knop Step over om de code vanaf het breakpoint telkens een stapje verder uit te voeren. Houd daarbij in de gaten wat er in de turtle tekening gebeurt, maar ook wat de waarde van de variabele zijde is. Die waarde wordt in Mu editor aan de rechterkant getoond.

../_images/debug_step_over.png

Begrijp je nu hoe de while loop werkt? Klik op Stop om het debuggen te stoppen.

Meer weten over inspringing van regels?

In Python bepaalt de inspringing (Engels: indentation) van een coderegel tot welk blok die regel behoort. Kopieer de onderstaande code naar Mu editor om te zien hoe dat werkt:

hello_while.py#
1i = 0
2while i < 3:
3    print('Deze zin wordt drie keer geprint.')
4    print('En deze zin valt ook binnen de while lus.')
5    i = i + 1
6print('Maar deze zin wordt slechts één keer geprint.')

De regels 3, 4 en 5 van hello_while.py zijn ingesprongen: ze worden voorafgegaan door 4 spaties. Daardoor weet Python dat die regels één blokje vormen binnen de while lus. Regel 6 is niet ingesprongen en hoort daardoor niet bij het blokje dat wordt herhaald.

Bestudeer nu de volgende code eens, nadat je hem in Mu editor hebt uitgevoerd. Je ziet hier een while lus bínnen een andere while lus.

turtle_while.py#
 1import turtle
 2
 3tony = turtle.Turtle()
 4
 5vierkant = 0
 6while vierkant < 3:
 7    zijde = 0
 8    while zijde < 4:
 9        tony.fd(100)        # Deze regels
10        tony.lt(90)         # vallen binnen
11        zijde = zijde + 1   # de 2e while lus
12    tony.pu()
13    tony.lt(120)
14    tony.fd(100)
15    tony.pd()
16    vierkant = vierkant + 1

De regels 7 t/m 16 in deze code vallen binnen de while lus die begint op regel 6. Maar in dat blok begint op regel 8 een tweede while lus, die de regels 9 t/m 11 herhaalt. Let op de inspringing van regel 12: die valt niet meer onder de tweede while lus.

Wanneer je in Mu editor op Enter drukt nadat je regel 6 hebt getypt, springt de volgende regel automatisch in. Wil je handmatig een regel laten inspringen, dan kun je daarvoor de Tab toets gebruiken (links naast de Q).

In de volgende opdrachten ga je je eigen while loops schrijven. Je zult merken dat je met loops mooie patronen kunt tekenen.

Opdracht 02

Vervang de code in turtle_while.py door een programma dat met behulp van een while loop een driehoek tekent met zijden van 100 pixels. Na het tekenen van een zijde moet de turtle telkens 120 graden draaien.

Oplossing
turtle_while.py#
1import turtle
2
3tony = turtle.Turtle()
4
5zijde = 0
6while zijde < 3:
7    tony.fd(100)
8    tony.lt(120)
9    zijde = zijde + 1
Opdracht 03

Vervang de code in turtle_while.py door een programma dat met behulp van een while loop binnen een andere while loop vier driehoeken op een rij tekent zoals hieronder afgebeeld.

../_images/triangles_in_a_row.png
Hint

Gebruik voor je programma de volgende structuur:

import turtle

tony = turtle.Turtle()

driehoek = 0
while driehoek < 4:
    zijde = 0
    while zijde < 3:
        ...
        ...
        ...
    ...
    ...
Oplossing
turtle_while.py#
 1import turtle
 2
 3tony = turtle.Turtle()
 4
 5driehoek = 0
 6while driehoek < 4:
 7    zijde = 0
 8    while zijde < 3:
 9        tony.fd(100)
10        tony.lt(120)
11        zijde = zijde + 1
12    tony.fd(100)
13    driehoek = driehoek + 1
Opdracht 04

Vervang de code in turtle_while.py door een programma dat met behulp van een while loop binnen een andere while loop 20 vierkanten tekent, waarbij elk vierkant 18 graden gedraaid is ten opzicht van het vorige. Dit moet de volgende figuur opleveren:

../_images/star_of_squares.png
Hint

Je programma bestaat uit twee while loops, waarvan de binnenste het tekenen van één vierkant verzorgt. Na het tekenen van een vierkant moet de turtle 18 graden linksom draaien.

...
while ...:
    # Deze while loop zorgt voor 20 herhalingen.
    ...
    while ...:
        # Deze while loop zorgt voor één vierkant.
        ...
        ...
    tony.lt(18)  # Draai tony 18 graden linksom
    ...
Opdracht 05

Maak een nieuw bestand in Mu editor, kopieer onderstaande de code erin en sla het op onder de naam turtle_dots.py.

turtle_dots.py#
 1import turtle
 2
 3tony = turtle.Turtle()
 4tony.hideturtle()
 5tony.speed(0)
 6
 7rij = 0
 8while ...:
 9    kolom = 0
10    while ...:
11        tony.dot(20, 'red')
12        ...
13        ...
14        ...
15        ...
16    ...
17    ...
18    ...

Vervang de puntjes in de gemarkeerde regels door code die ervoor zorgt dat een rooster van 10 bij 10 rode puntjes wordt getekend.

../_images/red_dots.png

Het wordt nóg interessanter wanneer je de while loop variabele niet alleen als teller gebruikt, maar bijvoorbeeld ook aan turtle.fd() meegeeft zoals in onderstaand voorbeeld turtle_spiral.py.

turtle_spiral.py#
1import turtle
2
3tony = turtle.Turtle()
4
5lengte = 2
6while lengte < 300:
7    tony.fd(lengte)
8    tony.lt(30)
9    lengte = lengte + 2

Deze code tekent eerst een lijnstukje van 2 pixels, vervolgens een lijnstukje van 4 pixels, dan 6 pixels, dan 8 pixels, enzovoort. En tussendoor draait de turtle telkens 30 graden. Kijk maar eens wat dat oplevert, door de code in Mu editor uit te proberen.

Opdracht 06

Experimenteer met de code in turtle_spiral.py door telkens één getal een beetje te veranderen en te bekijken hoe de figuur verandert. En wat gebeurt er als je op regel 8 tony.lt(30) vervangt door tony.lt(lengte) of tony.lt(3 * lengte)? Probeer maar uit!

2.2. For loops#

Een while loop kost je tenminste 3 regels code:

  1. Een regel om de tellervariabele aan te maken.

  2. Een regel met het while statement.

  3. Een regel die de tellervariabele aanpast.

Voor het tekenen van een vierkant waarmee deze les begon, zag dat er zo uit:

zijde = 0               # Hier wordt de tellervariabele aangemaakt.
while zijde < 4:        # Dit is het while statement.
    ...
    ...
    zijde = zijde + 1   # Hier wordt de tellervariabele aangepast.

Een for loop voegt deze drie acties samen in slechts één coderegel. Test de volgende code maar eens in Mu editor:

turtle_for.py#
1import turtle
2
3tony = turtle.Turtle()
4
5for zijde in range(4):
6    tony.fd(100)
7    tony.lt(90)

Waar we in het eerste voorbeeld van deze les nog 5 regels code nodig hadden om een vierkant te tekenen, hebben we nu genoeg aan 3 regels! Als je een breakpoint in regel 5 plaatst en de Debug mode gebruikt (zie Opdracht 01 voor uitleg over debuggen), kun je checken dat de waarde van de variabele zijde weer van 0 tot en met 3 loopt.

Opdracht 07

Vervang de code in turtle_for.py door een programma dat de onderstaande figuur tekent. Je mag zelf de kleur en de pendikte bepalen, maar voor het daadwerkelijke tekenen mag je maximaal 3 regels code gebruiken.

../_images/five_pointed_star.png
Hint

Vind je het lastig om de draaiingshoek te bepalen? Bedenk dan dat de turtle in totaal 2 keer volledig ronddraait (dus de totale draaiingshoek is 2 * 360° = 720°) en dat die volledige draai over 5 stappen wordt verdeeld.

Opdracht 08

Vervang de code in turtle_for.py door een programma dat de onderstaande figuur tekent. Deze ‘bloem’ bestaat uit 10 vierkanten met zijden van lengte 100. Om hem te tekenen heb je twee for loops nodig: één om iets 10 keer uit te voeren en daarbinnen één om een vierkant te tekenen.

../_images/flower_of_squares.png

Je kunt de bloem nog mooier maken door fillcolor(), begin_fill() en end_fill() te gebruiken en een stip (dot()) in het midden te plaatsen.

../_images/flower_of_squares_2.png