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 3: Geen block scope in Python

Een variabele uit een if of for leeft gewoon door — behalve als het blok nooit draaide.

Alleen functies maken een nieuwe scope

In taak 1 leerde je dat een functie zijn eigen scope heeft. De logische vervolgvraag is: geldt dat ook voor een if of een for? In veel andere talen wel. In Python niet: alleen een functie maakt een nieuwe scope.

temperature = 75

if temperature > 60:
    status = "te heet"        # binnen het if-blok aangemaakt
    limit = 60

print(f"Status: {status} (grens: {limit}°C)")
# Status: te heet (grens: 60°C)   ← werkt gewoon

Hetzelfde geldt voor een lus. De lus-variabele bestaat ná de lus nog steeds:

for value in [45, 80, 12]:
    last_reading = value

print(f"Laatst gelezen: {last_reading}")   # 12
print(f"Loop-variabele: {value}")          # 12 — bestaat nog!

Drie concrete problemen

  1. Draait het blok niet, dan bestaat de variabele niet. Bij temperature = 45 wordt het if-blok overgeslagen en crasht de print() met een NameError.
  2. Je ziet het niet aan de code. Of het werkt, hangt af van de waarde op dat moment — niet van hoe je code eruitziet.
  3. Oude waarden blijven rondslingeren. Een variabele uit een vorige lus of if-tak staat er nog, met een waarde die niet meer klopt.

De oplossing: zet de variabele vóór het blok

😩 Alleen in de if-tak
temperature = 45

if temperature > 60:
    status = "te heet"

print(f"Status: {status}")

# NameError: name 'status'
#            is not defined
✨ Vooraf een startwaarde
temperature = 45
status = "normaal"

if temperature > 60:
    status = "te heet"

print(f"Status: {status}")

# Status: normaal

Met een startwaarde vóór het blok bestaat de variabele altijd. Of het blok nu draait of niet: print() heeft altijd iets te tonen.

Interactieve demo — bestaat de variabele?

Kies een meetreeks en kijk of de print() na het blok werkt. Zet de startwaarde aan om het verschil te zien:

Block-scope inspecteur
Kies een meetreeks…
Vuistregel: maakt een variabele alleen in een if- of for-blok? Geef hem dan vóór het blok een startwaarde. Dan kan je code nooit afhangen van of het blok toevallig draaide.
>_ Probeer het voorbeeld

Deze code zoekt de laatste meting boven de grens. Met deze waarden werkt hij — maar hij is stuk te krijgen. Deze tester draait geen echte Python, maar rekent na wat jouw versie zou printen.

Probeer: haal 80 uit readings, maak de lijst helemaal leeg, of zet THRESHOLD op 100. Los het daarna op met een startwaarde vóór de lus.

Klik op de knop om de uitvoer te zien.

Opdracht: vluchtcontrole die niet omvalt

Scenario: vóór het opstijgen controleert je script het vluchtplan op te grote stappen en op onbekende richtingen. Het script werkt prima zolang er iets fout is in het plan — maar bij een perfect plan, of een leeg plan, crasht het. Dat is precies het omgekeerde van wat je wilt.

Gegeven:

flight_plan = [
    {"direction": "forward", "distance": 100},
    {"direction": "up", "distance": 50},
]

VALID_DIRECTIONS = ["forward", "back", "left", "right", "up", "down"]
MAX_STEP_DISTANCE = 120

Je taak: schrijf de controle zo dat hij bij élk vluchtplan een nette uitkomst geeft — ook bij een plan zonder fouten en bij een leeg plan. Bepaal zelf welke variabelen je vooraf een startwaarde geeft.

Acceptatiecriteria:

  • Het script meldt hoeveel stappen te ver gaan en welke richtingen onbekend zijn
  • Een vluchtplan zonder fouten en een leeg vluchtplan geven allebei een duidelijke melding, geen foutmelding
  • Geen enkele variabele wordt alleen binnen een if- of for-blok aangemaakt
  • Elke meldregel toont de waarde én de grens, bijvoorbeeld Stap 1: 140 cm (max: 120 cm)
  • Met de drone: is het plan in orde, dan vliegt hij het en landt; zit er een fout in, dan blijft hij aan de grond