Naar www.aaappp.nl/informatica of Praktijkopdracht programmeren in Python

DRY programmeren met Python Turtle

We veronderstellen dat je weet hoe de Python-shell werkt en hoe je code in de Python-editor kunt plakken.
Kijk eventueel terug op Functies in Python

Hieronder staat een beschrijving van de ontwikkeling van een Python-programma om met de turtle een driehoek en een zestienhoek te tekenen. Het begint met een "quick and dirty"-versie, die precies doet wat de bedoeling is. Daarna volgen we het proces van "refactoring" oftewel het verbeteren van de code zoals een professionele programmeur dat zou doen. Dit doen we volgens het DRY principe. DRY staat voor Don't Repeat Yourself. Het idee is dat je een stukje code een keer schrijft en daarom maar een keer goed hoeft te testen. Daarna kan je dat stukje code op allerlei plaatsen steeds opnieuw hergebruiken.

Versie 0: quick and dirty

De programmeur van onderstaande Python-programma heeft goed getest, want bovenstaande tekeningen verschijnen in het turtle window. De programmeur heeft door proberen en zelf uitrekenen de juiste getallen voor de turtle-commando's gevonden.

import turtle
t = turtle.Turtle()

# ga naar links maar nog niet tekenen
t.penup()
t.goto(-300,0)

# teken een driehoek
t.pendown()
t.forward(200)
t.left(120) 
t.forward(200) 
t.left(120)
t.forward(200)
t.left(120)

# ga naar rechts en nog niet tekenen
t.penup()
t.goto(100,0)

# teken een zestienhoek
t.pendown()
t.forward(50)
t.left(22.5) 
t.forward(50) 
t.left(22.5)
t.forward(50)
t.left(22.5)
t.forward(50)
t.left(22.5) 
t.forward(50)
t.left(22.5) 
t.forward(50) 
t.left(22.5)
t.forward(50)
t.left(22.5)
t.forward(50)
t.left(22.5)
t.forward(50)
t.left(22.5) 
t.forward(50) 
t.left(22.5)
t.forward(50)
t.left(22.5)
t.forward(50)
t.left(22.5)
t.forward(50)
t.left(22.5) 
t.forward(50) 
t.left(22.5)
t.forward(50)
t.left(22.5)
t.forward(50)
t.left(22.5) 

# klaar en maak de turtle onzichtbaar
t.hideturtle()
    

De turtle-commando's zijn niet standaard Python. Daarom moet je die jouw programma binnenhalen. Dat doe je met import. Zie de eerste regel van versie 0.
Het is echter helemaal fout gegaan in het geval op het plaatje. Dit heeft iets te maken met de naam van het Python-programma. Snap je waarom dit is misgegaan?

Versie 1: for-loops

Bij de eerste refactoring-stap vervangen we lange reeksen turtle-commando's door twee for-loops. Versie 1 doet precies hetzelfde als de quick and dirty versie, maar is veel korter.

import turtle
t = turtle.Turtle()

# ga naar links maar nog niet tekenen
t.penup()
t.goto(-300,0)

# teken een driehoek
t.pendown()
for i in range(3):
    t.forward(200)
    t.left(120)

# ga naar rechts en nog niet tekenen
t.penup()
t.goto(100,0)

# teken een zestienhoek
t.pendown()
for i in range(16):
    t.forward(50)
    t.left(22.5)

# klaar en maak de turtle onzichtbaar
t.hideturtle()
      

Versie 2: de computer laten rekenen

Bij de tweede refactoring-stap introduceren we de variabelen: zijde, aantalZijden en hoek. Verder laten we de computer de juiste hoek in graden uitrekenen. Voor de driehoek is dat 360 / 3 = 120 en voor de zestienhoek is dat 360 / 16 = 22,5. Voor zowel de driehoek als de zestienhoek geldt de formule 360 / aantalZijden. We hebben nu de hoek voor het naar links draaien, de lengte van een zijde en het aantalZijden op dezelfde manier gecodeerd voor zowel de driehoek als de zestienhoek. Volgens het DRY principe kunnen we die code vervangen in een derde refactoring-stap.

import turtle
t = turtle.Turtle()

# ga naar links maar nog niet tekenen
t.penup()
t.goto(-300,0)

# teken een driehoek
t.pendown()
zijde = 200
aantalZijden = 3
hoek = 360 / aantalZijden
for i in range(aantalZijden):
    t.forward(zijde)
    t.left(hoek) 

# ga naar rechts en nog niet tekenen
t.penup()
t.goto(100,0)

# teken een zestienhoek
t.pendown()
zijde = 50
aantalZijden = 16
hoek = 360 / aantalZijden
for i in range(aantalZijden):
    t.forward(zijde)
    t.left(hoek)

# klaar en maak de turtle onzichtbaar
t.hideturtle()
    

Versie 3: def regelmatigeVeelhoek

De functie regelmatigeVeelhoek is geschikt zowel de driehoek als de zestienhoek. En zo is het Python-programma weer korter geworden en eleganter!

import turtle
t = turtle.Turtle()

def regelmatigeVeelhoek(zijde, aantalZijden):
    t.pendown()
    hoek = 360 / aantalZijden
    for i in range(aantalZijden):
        t.forward(zijde)
        t.left(hoek)

# ga naar links maar nog niet tekenen
t.penup()
t.goto(-300,0)

# teken een driehoek
regelmatigeVeelhoek(200, 3)

# ga naar rechts en nog niet tekenen
t.penup()
t.goto(100,0)

# teken een zestienhoek
regelmatigeVeelhoek(50, 16)

# klaar en maak de turtle onzichtbaar
t.hideturtle()
    

Versie 4: teken een vijfhoek en een achthoek

Verander nu zelf 2 regels in versie 3 van het Python-programma om een vijfhoek en een achthoek te tekenen.

Samenvatting

Op de eerste webpagina had je al veel geleerd. Dit is alles wat je van deze webpagina moest leren.

Je kunt nu verder gaan met Huisjes tekenen met Python Turtle