0%

Zelf functies schrijven · oefening

Lokale variabelen en bereik

Een functie creëert een kleine werkruimte voor haar variabelen. Een variabele die binnen een functie een waarde krijgt, is normaal gesproken lokaal voor die functie.

Het bereik van een naam, ook wel de scope, is het deel van het programma waar die naam beschikbaar is.

def make_status(place):
    message = f"Trip to {place}"
    return message

Zowel place als message zijn lokale namen. Ze zijn beschikbaar terwijl make_status wordt uitgevoerd. Na afloop van de aanroep kan de teruggegeven string blijven bestaan, maar zijn die lokale namen niet meer beschikbaar voor de aanroeper.

current = make_status("Seoul")
print(current)   # Trip to Seoul
print(message)   # NameError

current ontvangt de waarde. De variabele ontvangt niet de lokale variabele zelf.

Dezelfde naam kan in verschillende bereiken bestaan

Zichtbaar bewijs werkt beter dan een regel uit je hoofd leren:

Try it

De toewijzing binnen make_status maakt een lokale status. Ze vervangt de status op het hoogste niveau niet.

De uitvoer laat zien dat er twee afzonderlijke namen zijn:

Inside: Trip to Seoul
Returned: Trip to Seoul
Outside: Not started
Buiten de functie en binnen het functiebereik bestaat elk een afzonderlijke variabele status, terwijl de functie alleen haar waarde teruggeeft aan current.

Wanneer de aanroep eindigt, verdwijnt de lokale status. De status op het hoogste niveau is nog steeds "Not started". In de figuur betekent “Outside function” buiten de functie en “Function scope” het bereik binnen de functie. “Return value” is de teruggegeven waarde; “Same name, separate scopes” benadrukt dat dezelfde naam in afzonderlijke bereiken bestaat.

Parameters zijn ook lokaal

In deze functie wordt place voor elke aanroep aangemaakt:

def make_status(place):
    status = f"Trip to {place}"
    return status

Bij de aanroep make_status("Seoul") krijgt de lokale parameter place de waarde "Seoul". Een latere aanroep met "Lagos" krijgt een eigen uitvoering en eigen lokale waarden.

Die afzondering is handig. Een functie kan duidelijke tijdelijke namen gebruiken zonder de rest van het programma ermee te vullen.

Geef informatie mee en geef resultaten terug

Gebruik voorlopig dit betrouwbare patroon:

def make_status(place):
    status = f"Trip to {place}"
    return status

current = make_status("Seoul")
  • Parameters geven de benodigde informatie door aan de functie.

  • Lokale variabelen bewaren tussenresultaten.

  • return geeft een resultaat terug.

Python biedt manieren om namen buiten een functie te benaderen en te wijzigen, maar een beginnersprogramma is meestal makkelijker te begrijpen als informatie de grens expliciet oversteekt.

Wat is de laatste regel die dit programma afdrukt?

label = "OUTSIDE"

def make_label():
    label = "INSIDE"
    return label

result = make_label()
print(result)
print(label)

Opdracht

Maak make_status(place) af.

Binnen de functie:

  1. maak een lokale variabele met de naam status;

  2. geef die de waarde Trip to gevolgd door place;

  3. geef die lokale waarde terug.

Wijzig de status op het hoogste niveau niet.

Verwachte uitvoer:

Trip to Seoul
Not started

Gebruik na een geslaagde controle Step in de oefeneditor. Kijk hoe de lokale status tijdens de aanroep verschijnt. Kijk na return hoe current_status de waarde ontvangt terwijl de status buiten de functie ongewijzigd blijft.