0%

Meer expressieve functies · oefening

Pure functies en neveneffecten

In de vorige les gaf de functie percentage een waarde terug in plaats van die af te drukken. Door die keuze kan de rest van het programma bepalen of het resultaat wordt getoond, opgeslagen of in een andere berekening gebruikt.

Vergelijk dat ontwerp met een functie waarvan de enige taak afdrukken is. Het verschil introduceert twee nuttige ideeën: berekening en neveneffecten.

Deze functie bouwt een scoreregel en geeft die terug:

def score_line(score, total):
    return f"Score: {score}/{total}"

Bij dezelfde argumenten geeft de functie hetzelfde resultaat terug. Ze drukt niets af, vraagt niet om invoer en verandert geen gegevens buiten de functie. Een functie met die eigenschappen heet een pure functie.

Vergelijk die nu met een functie die de regel direct toont:

def show_score(score, total):
    print(f"Score: {score}/{total}")

Afdrukken verandert de zichtbare uitvoer van het programma en is dus een neveneffect. Andere neveneffecten zijn een meegegeven lijst wijzigen, een bestand schrijven en een netwerkverzoek versturen.

Neveneffecten zijn geen fouten. Een nuttig programma moet uiteindelijk iets tonen, opslaan of versturen. De ontwerpkeuze is of berekening en actie worden gemengd of op afzonderlijke plekken blijven.

Scheid bouwen van tonen

Vergelijk deze aanpakken voor een onderwerplabel:

def show_topic(number, topic):
    print(f"{number}. {topic}")
def build_topic_label(number, topic):
    return f"{number}. {topic}"


print(build_topic_label(2, "Functions"))

Het tweede ontwerp bouwt eerst de tekst en toont die daarna. Omdat de teruggegeven tekst een gewone waarde is, kun je die opslaan en bekijken:

label = build_topic_label(2, "Functions")
print(label)
print(label == "2. Functions")

De vergelijking drukt True af en bevestigt daarmee dat de functie de verwachte tekst teruggeeft. Een webpagina, terminalprogramma of toekomstige bestandsexporteur kan dezelfde teruggegeven waarde hergebruiken.

Pure functies verminderen ook verrassingen. build_topic_label aanroepen drukt niet ongemerkt iets af.

Welke functie is puur?

Herstructureer een rapportfunctie

Het startprogramma mengt het bouwen en tonen van een rapport in één functie. Herstructureer het zodat build_report alleen de tekst teruggeeft, terwijl de laatste print buiten de functie blijft.

Opdracht

Herstructureer het programma.

  • Hernoem show_report naar build_report.

  • Laat de functie name: score/total teruggeven in plaats van afdrukken.

  • Druk niets af binnen build_report.

  • Druk onderaan de waarde af die build_report("Mina", 8, 10) teruggeeft.

De afgeschermde controles roepen de functie ook met nog niet getoonde waarden aan.