0%

Werk herhalen met lussen · oefening

Bouw een resultaat op

In de vorige twee oefeningen verzamelde je de waarden van een range in een lijst. Soms heb je één antwoord nodig dat van alle waarden afhangt, zoals de totale prijs van meerdere items.

Daarvoor heb je een variabele nodig die van de ene ronde naar de volgende blijft bestaan.

Begin erbuiten, verander erbinnen, gebruik erna

Stel dat je het totaal van een lijst met prijzen wilt berekenen:

Try it

Drie regels, drie taken:

  1. total = 0 wordt vóór de lus uitgevoerd. Die regel maakt de variabele en geeft haar een beginwaarde.

  2. total = total + price wordt binnen de lus uitgevoerd, één keer per waarde. Die neemt het huidige totaal en vervangt het door een groter totaal.

  3. print(total) wordt na de lus uitgevoerd, wanneer elke waarde is opgeteld.

Dat patroon heeft een naam. De variabele heet een accumulator en dit is het accumulatorpatroon. De lus houdt één resultaat bij waaraan elke waarde bijdraagt.

Volg total door de rondes: het begint bij 0 en bevat daarna 4, dan 13 en dan 28. Het per ronde zien oplopen maakt het patroon duidelijker dan er alleen over lezen. De oefening aan het einde van deze les is een goede plek om dat te doen met Step.

Deze vier panelen tonen de accumulator vóór de lus en na elke optelling. Before loop betekent vóór de lus; pass betekent ronde:

Vier panelen volgen total vanaf nul via de optellingen 0 plus 4, 4 plus 9 en 13 plus 15, met 28 als eindwaarde.

Waarom de beginwaarde belangrijk is

Zet total = 0 op de verkeerde plek en de lus zet het totaal elke ronde terug:

Try it

Het antwoord is 15, de laatste prijs, omdat het totaal vóór elke optelling werd weggegooid. Als een accumulator uiteindelijk alleen de laatste waarde bevat, controleer dan of je hem per ongeluk binnen de lus hebt ingesteld.

De regel helemaal weglaten geeft bij de eerste ronde een NameError, omdat total + price een al bestaande total nodig heeft.

Wat drukt deze code af?

values = [2, 5, 3]

total = 0
for value in values:
    total = total + value
    print(total)

Waar hoort de beginwaarde van een accumulator?

Zodra de lange vorm duidelijk is

Python heeft een kortere schrijfwijze voor het bijwerken:

total += price

Voor deze getallen betekent die hetzelfde als total = total + price: neem het huidige totaal, tel de huidige prijs erbij op en sla de nieuwe waarde weer op in total. De lange vorm is prettig terwijl je het patroon volgt. De korte vorm is handig zodra je kunt uitleggen wat die vervangt.

Bereken nu zelf een totaal. Eén accumulator is genoeg voor een eerste kennismaking; die heeft al veel te onthouden.

Opdracht

De lijst donations staat al klaar. Gebruik één lus om elke donatie bij total op te tellen en behoud de overzichtsregel na de lus.

Verwachte uitvoer:

Total: 142

Stel total vóór de lus in. Je kunt de wijziging schrijven als total = total + donation of, zodra dat duidelijk voelt, als total += donation.

Kijk hoe de accumulator groeit

Klik op Step in de werkbalk van de editor zodra het programma werkt en loop er met Next doorheen. Bekijk het variabelenpaneel.

Kijk hoe total stijgt van 0 naar 12, dan naar 57 en uiteindelijk naar 142. De nuttige vraag bij elke ronde is: ‘Wat bevatte total vóór deze donatie en wat bevat het nu?’