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 2: Getal vs lijst als parameter

Waarom een functie een lijst wél kan wijzigen en een getal niet.

Twee soorten waarden, twee verschillende regels

In taak 1 zag je dat variabelen binnen een functie lokaal zijn. Nu wordt het lastiger: wat gebeurt er met een waarde die je meegeeft als parameter? Het antwoord hangt af van het soort waarde — en dat verrast bijna iedereen de eerste keer.

Een getal aanpassen werkt niet

def pay(balance, amount):
    balance = balance - amount
    print(f"Binnen de functie: € {balance}")

balance = 80
pay(balance, 25)
print(f"Buiten de functie: € {balance}")

# Binnen de functie: € 55
# Buiten de functie: € 80   ← onveranderd!

Een lijst aanpassen werkt wél

def add_entry(entries, text):
    entries.append(text)

system_log = []
add_entry(system_log, "opgestart")
print(system_log)

# ['opgestart']   ← de lijst buiten de functie is echt veranderd

Drie concrete problemen

  1. De regels lijken elkaar tegen te spreken. Dezelfde soort code geeft bij een getal een ander resultaat dan bij een lijst.
  2. Er komt geen foutmelding. Je code draait gewoon door met de oude waarde — je merkt het pas als er iets anders misgaat.
  3. Het werkt ook per ongeluk. Een functie die een lijst aanpast terwijl jij dat niet verwachtte, verandert gegevens waar je niet naar kijkt.

Waar het verschil zit

Een naam in Python wijst naar een object. Sommige objecten kun je aanpassen (mutable), andere niet (immutable):

  • Immutable: int, float, str, bool, tuple — je kunt het getal 80 niet veranderen in 55.
  • Mutable: list, dict, set — je kunt er iets in stoppen of uithalen zonder een nieuw object te maken.

Met = laat je een naam naar iets anders wijzen. Met .append() of entries[0] = ... pas je het object zelf aan. Het eerste blijft binnen de functie, het tweede is buiten zichtbaar.

😩 Toewijzen — blijft binnen
def pay(balance, amount):
    balance = balance - amount
    # nieuwe waarde, nieuwe plek
    # de naam buiten wijst nog
    # steeds naar 80

balance = 80
pay(balance, 25)
print(balance)      # 80
✨ Return — waarde naar buiten
def pay(balance, amount):
    return balance - amount

balance = 80
balance = pay(balance, 25)
print(f"Saldo: € {balance}")

# Saldo: € 55

Interactieve demo — wat gebeurt er in het geheugen?

Kies een type en kijk wat de functie met de waarde buiten doet:

Geheugen-inspecteur
Kies een type…
Vuistregel: vertrouw nooit op een functie die een parameter aanpast. Gebruik return en vang de waarde op — dan werkt het voor élk type hetzelfde.
>_ Probeer het voorbeeld

Twee functies: één werkt met een getal, één met een lijst. Draai de code en kijk welke van de twee waarden buiten de functie is veranderd. Deze tester draait geen echte Python, maar rekent na wat jouw versie zou printen.

Probeer daarna: voeg return toe aan pay() en vang de waarde op, of roep pay() twee keer aan.

Klik op de knop om de uitvoer te zien.

Opdracht: accu bijhouden tijdens de vlucht

Scenario: tijdens het uitvoeren van een vluchtplan wil je twee dingen bijhouden: hoeveel accu er nog over is, en wat de drone allemaal gedaan heeft. Het accupercentage is een getal, het vluchtlogboek is een lijst — en die twee gedragen zich dus verschillend.

Gegeven:

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

battery = 100          # procent
POWER_PER_100_CM = 8   # procent accu per 100 cm
MIN_BATTERY = 20       # onder deze grens niet meer vliegen

Je taak: schrijf een functie die het accuverbruik van één stap verwerkt en een functie die een regel aan het logboek toevoegt. Voer daarna het plan stap voor stap uit en houd beide bij.

Acceptatiecriteria:

  • Het accupercentage wordt bijgewerkt via return, niet door de parameter aan te passen
  • Het logboek wordt gevuld door de lijst aan de functie mee te geven
  • Zakt de berekende accu onder MIN_BATTERY, dan stopt de vlucht en wordt dat gemeld; elke regel toont waarde én grens, zoals Accu: 76% (min: 20%)
  • Test zonder drone met een lage startwaarde dat het stoppen werkt, en met 100% dat het hele plan doorgaat
  • Met de drone: vlieg het plan echt en print na de landing de berekende én de gemeten accu (get_battery()) naast elkaar