0%

Meer expressieve functies · oefening

Optionele waarden en None

In de vorige les was False een echte instelling. Die betekende dat een bepaalde opschoning niet moest plaatsvinden. Dat is iets anders dan helemaal geen keuze meegeven.

Sommige optionele parameters moeten twee situaties onderscheiden:

  • er is geen waarde meegegeven, dus de functie moet er één kiezen;

  • er is een waarde meegegeven, dus de functie moet die behouden.

De waarde None van Python geeft ons een duidelijke manier om de eerste situatie weer te geven:

def build_feedback(score, total, note=None):
    if note is None:
        note = "Keep practicing."
    return f"{score}/{total}: {note}"

Hier betekent note=None niet dat elke notitie None moet zijn. Het betekent dat note begint als None wanneer de functie zonder dat argument wordt aangeroepen:

build_feedback(6, 10)

Code kan nog steeds een notitie meegeven wanneer die er is:

build_feedback(10, 10, note="Perfect score!")

De functie vervangt None door haar eigen bericht, maar laat een meegegeven notitie met rust.

Controleer identiteit met is None

Controleer op die ene exacte waarde om te vragen of de notitie is weggelaten:

if note is None:

None is één specifieke waarde, dus identiteit is de duidelijkste controle. Een truthinesscontrole zou ruimer zijn:

if not note:

Zoals je in Python-basis I leerde, zijn None, "", 0 en False allemaal falsy. Die ruimere voorwaarde zou ze allemaal als afwezig behandelen, zelfs wanneer de aanroepende code er bewust één heeft meegegeven.

Een lege string kan bijvoorbeeld bewust vragen om geen bericht:

build_feedback(8, 10, note="")

De lege string is meegegeven. Die vervangen door standaardfeedback zou de keuze van de aanroeper negeren.

Waarom is if note is None beter dan if not note voor deze optionele notitie?

Geef alleen feedback wanneer die ontbreekt

Maak build_feedback af door dit onderscheid in code om te zetten. Kies alleen een bericht wanneer note is None; behoud anders de meegegeven string, ook als die leeg is.

Opdracht

Maak build_feedback af.

  • Gebruik als note is None de tekst "Perfect score!" wanneer score == total.

  • Gebruik anders, wanneer note is None, de tekst "Keep practicing.".

  • Behoud een notitie die de aanroeper meegeeft exact, ook wanneer die "" is.

  • Geef score/total: note terug.

Druk niets af binnen de functie.