Sprint 5 · Functies & scope  ·  US4: Scope

Als developer van het vliegscript, wil ik weten waar een variabele bestaat en wat een functie wel en niet kan veranderen, zodat mijn vluchtberekeningen nooit stilletjes met een oude of verkeerde waarde doorrekenen.

Taak 1: Lokale variabelen & NameError

Een variabele die je binnen een functie aanmaakt, bestaat daarbuiten niet.

Twee werelden: binnen en buiten

In US1 tot US3 heb je geleerd functies te schrijven die één taak doen. Nu komt de vraag die daarbij hoort: waar leven de variabelen die je in zo'n functie gebruikt?

Elke functie heeft zijn eigen werkruimte, de lokale scope. Variabelen die je daarin aanmaakt bestaan alleen zolang de functie draait. Daarna zijn ze weg:

def calculate_average(readings):
    total = 0
    for value in readings:
        total = total + value
    average = total / len(readings)

readings = [45, 80, 12]
calculate_average(readings)
print(average)

Dit ziet er logisch uit, maar het crasht:

NameError: name 'average' is not defined

Drie concrete problemen

  1. De variabele is opgeruimd. Zodra de functie klaar is, verdwijnt average — Python houdt hem niet vast.
  2. De berekening is voor niets gedaan. De functie rekende alles uit, maar gaf niets terug. Het resultaat is nergens meer te vinden.
  3. De foutmelding komt op de verkeerde regel. Python klaagt bij print(), terwijl de oorzaak in de functie zit.

De oplossing: return

Met return stuur je de waarde naar buiten. Buiten de functie vang je hem op in een nieuwe variabele:

😩 Zonder return
def calculate_average(readings):
    total = 0
    for value in readings:
        total = total + value
    average = total / len(readings)

readings = [45, 80, 12]
calculate_average(readings)
print(average)

# NameError: name 'average'
#            is not defined
✨ Met return
def calculate_average(readings):
    total = 0
    for value in readings:
        total = total + value
    return total / len(readings)

readings = [45, 80, 12]
result = calculate_average(readings)
print(f"Gemiddelde: {result}")

# Gemiddelde: 45.666...

De variabele average bestaat nog steeds alleen binnen de functie. Wat naar buiten gaat is de waarde — en die sla je op onder een naam die je zelf kiest.

Interactieve demo — de scope-grens

Loop de drie momenten door en kijk welke variabelen op dat moment bestaan. Zet return aan of uit om het verschil te zien:

Scope-inspecteur
Kies een moment…
Vuistregel: wat een functie berekent, komt er alleen uit via return. Zie je een NameError? Kijk of de variabele binnen een functie is aangemaakt.
>_ Probeer het voorbeeld

De code hieronder telt sensorwaarden op, maar crasht op de laatste regel. Draai hem, lees de foutmelding en los hem op met return. Deze tester draait geen echte Python, maar rekent na wat jouw versie zou printen.

Probeer daarna: print total in plaats van je eigen variabele, haal de return weer weg, of verander de waarden in readings.

Klik op de knop om de uitvoer te zien.

Opdracht: vluchtplan doorrekenen

Scenario: voordat de drone opstijgt wil je weten of het vluchtplan haalbaar is. Je hebt drie gegevens nodig: de totale afstand, de langste losse stap, en of het plan binnen het bereik van de accu valt. Drie berekeningen, dus drie functies — en elke functie moet zijn resultaat naar buiten kunnen geven.

Gegeven:

flight_plan = [
    {"direction": "forward", "distance": 100},
    {"direction": "left", "distance": 60},
    {"direction": "up", "distance": 40},
    {"direction": "forward", "distance": 80},
]

MAX_FLIGHT_DISTANCE = 250   # cm die de accu aankan

Je taak: schrijf de drie functies en gebruik ze in één overzicht. Bepaal zelf de parameters en wat elke functie teruggeeft.

Acceptatiecriteria:

  • Er is een functie die de totale afstand van het plan teruggeeft
  • Er is een functie die de langste losse stap teruggeeft
  • Er is een functie die teruggeeft of het plan binnen MAX_FLIGHT_DISTANCE past
  • Geen enkele functie print zelf iets; de uitvoer toont per regel de waarde én de grens, zoals Totaal: 280 cm (max: 250 cm)
  • Met de drone: past het plan, dan vliegt hij het en landt; past het niet (zoals het gegeven plan), dan stijgt hij niet op — test beide