Beetje Coderen

Les 6 · Module 1 · Fundament (alleen Python)

Lussen sturen: break, continue en geneste lussen

Lussen vroeg verlaten, rondes overslaan en lussen in lussen gebruiken.

⏱ 45–60 minuten leestijd + oefenen

🎯 Na deze les kun je

  • break en continue doelgericht inzetten
  • een geneste lus uitleggen
  • een invoerlus met validatie bouwen

In les 5 liep een lus netjes van begin tot eind. Soms wil je eerder stoppen ("antwoord gevonden!") of één ronde overslaan ("dit getal telt niet mee"). Daarvoor zijn break en continue. Daarna zet je een lus in een lus, zodat je met twee regels code een hele tafelkaart maakt.

break: stop de lus nu

for getal in range(1, 100):
    if getal * getal > 50:
        print(f"Eerste getal met kwadraat boven 50: {getal}")
        break
print("Na de lus")
Eerste getal met kwadraat boven 50: 8
Na de lus

break stopt de lus direct. Python gaat verder met de eerste regel na de lus. De rondes 9 tot en met 99 worden niet meer uitgevoerd.

continue: sla de rest van deze ronde over

for getal in range(1, 8):
    if getal % 3 == 0:
        continue
    print(getal)
1
2
4
5
7

Bij continue springt Python terug naar de kop van de lus en begint de volgende ronde. Alles wat onder continue staat, wordt voor deze ronde overgeslagen.

Je kunt bijna elke continue ook schrijven met een if om het blok heen. Gebruik continue als het de code platter en leesbaarder maakt, bijvoorbeeld om ongeldige gevallen bovenaan weg te filteren.

Invoer blijven vragen tot die klopt

Het belangrijkste gebruik van break: een invoerlus (input loop) die blijft vragen tot het antwoord bruikbaar is.

while True:
    antwoord = input("Wil je doorgaan? (j/n) ").lower()
    if antwoord == "j" or antwoord == "n":
        break
    print("Typ j of n.")
print(f"Je koos {antwoord}")
Wil je doorgaan? (j/n) misschien
Typ j of n.
Wil je doorgaan? (j/n) J
Je koos j

while True is een lus die nooit uit zichzelf stopt. Dat is hier juist de bedoeling: de enige uitgang is de break, en die bereik je pas bij geldige invoer. .lower() maakt de invoer kleine letters, zodat J ook goed is (meer over zulke methodes in les 7).

Een tweede voorbeeld: getallen optellen tot de gebruiker 0 typt.

totaal = 0
while True:
    getal = int(input("Getal (0 = stoppen): "))
    if getal == 0:
        break
    totaal += getal
print(f"Totaal: {totaal}")

Geneste lussen

Een lus in een lus heet een geneste lus (nested loop). Voor elke ronde van de buitenste lus loopt de binnenste lus helemaal.

for rij in range(1, 4):
    for kolom in range(1, 5):
        print(rij * kolom, end="\t")
    print()
1	2	3	4
2	4	6	8
3	6	9	12

Twee nieuwe dingen:

  • end="\t" laat print eindigen met een tab in plaats van een nieuwe regel. Zo komen getallen naast elkaar.
  • De lege print() na de binnenste lus begint een nieuwe regel. Hij springt maar één niveau in, dus hij hoort bij de buitenste lus: één keer per rij.

Het aantal rondes vermenigvuldigt zich: 3 rijen × 4 kolommen = 12 keer de binnenste print.

break stopt alleen de lus waar hij direct in staat. In een geneste lus stopt een break in de binnenste lus dus alleen de binnenste; de buitenste gaat gewoon door.

Uitgewerkt voorbeeld: een driehoek tekenen

Voorspel de uitvoer.

for regel in range(1, 5):
    for _ in range(regel):
        print("*", end="")
    print()
*
**
***
****

De binnenste lus loopt regel keer: op regel 1 één keer, op regel 4 vier keer. Het liggende streepje _ is een gebruikelijke naam voor een lusvariabele die je niet gebruikt.

Typische fout: verkeerde inspringing van de binnenste lus

for rij in range(1, 4):
    for kolom in range(1, 5):
        print(rij * kolom, end="\t")
        print()

Hier springt de lege print() twee niveaus in en hoort hij bij de binnenste lus. Elk getal komt dan op een eigen regel. Kijk bij geneste lussen altijd naar de inspringing van elke regel en vraag je af: hoe vaak moet deze regel uitgevoerd worden? Eén keer per rij → buitenste lus. Eén keer per vakje → binnenste lus.

Oefenen

Oefening 1. Voorspel de uitvoer:

for i in range(1, 10):
    if i == 6:
        break
    if i % 2 == 0:
        continue
    print(i)
Modelantwoord oefening 1
1
3
5

Even getallen worden overgeslagen door continue; bij 6 stopt break de lus.

Oefening 2. Schrijf een invoerlus die een cijfer tussen 1 en 10 vraagt (kommagetal toegestaan) en blijft vragen tot het cijfer in dat bereik ligt.

Modelantwoord oefening 2
while True:
    cijfer = float(input("Cijfer (1-10): "))
    if 1 <= cijfer <= 10:
        break
    print("Dat cijfer ligt niet tussen 1 en 10.")
print(f"Ingevoerd: {cijfer}")

Typt iemand tekst, dan crasht float() nog met een ValueError. Dat vang je op in les 13.

Oefening 3. Print met geneste lussen alle combinaties van een dobbelsteen met een munt: 1 kop, 1 munt, 2 kop, … tot 6 munt. Gebruik voor de munt for kant in ["kop", "munt"]: (lijsten komen in les 8).

Modelantwoord oefening 3
for ogen in range(1, 7):
    for kant in ["kop", "munt"]:
        print(ogen, kant)

Dat zijn 6 × 2 = 12 regels.

Lab: tafels oefenen

  1. Maak tafels.py.
  2. Vraag welke tafel de gebruiker wil oefenen (1 tot en met 10).
  3. Stel voor elke som van 1 x tafel tot 10 x tafel de vraag, bijvoorbeeld 3 x 7 = .
  4. Is het antwoord fout, print dan Nog een keer. en vraag dezelfde som opnieuw, tot het antwoord goed is (een while True met break binnen de for-lus).
  5. Tel hoeveel sommen in één keer goed waren en print aan het eind: In één keer goed: 8 van 10.
  6. Controleer met beetje check concepten-les6.

Samenvatting

  • break stopt de lus direct; Python gaat verder na de lus.
  • continue slaat de rest van de huidige ronde over.
  • while True met een break bij geldige invoer is het standaardpatroon voor invoervalidatie.
  • In een geneste lus loopt de binnenste lus volledig voor elke ronde van de buitenste.
  • De inspringing bepaalt bij welke lus een regel hoort; break stopt alleen de binnenste lus.

In les 7 duik je in tekst: letters opvragen, stukken uitknippen en tekst opschonen met stringmethodes.

Lab

Tafels-oefenprogramma dat doorvraagt tot het antwoord goed is

🔒 Het live lab hoort bij de volledige cursus. Met één aankoop (€ 29,00, eenmalig) krijg je alle lessen, de live labs en het certificaat. Geen abonnement. Je kunt dit lab altijd gratis lokaal met Docker doen.

Cursus kopen en verdergaan

💻 Lokaal met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):

$ docker run -it --rm -e BEETJE_COURSE=programmeerconcepten -e BEETJE_LESSON=6 registry.wizg.it/webhosting/beetjecoderen-web:lab-python-latest

Krijg je unauthorized bij het downloaden? De registry vraagt een login. Bouw het image dan eerst zelf (eenmalig, een paar minuten):

$ docker build -t registry.wizg.it/webhosting/beetjecoderen-web:lab-python-latest -f python.Dockerfile https://beetjecoderen.nl/labs/lab-images.tar.gz

In de container: beetje lijst toont alle lessen van het image.

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker.

Klaar? Controleer je werk met:

$ beetje check concepten-les6

📝 Quiz: lussen sturen

5 vragen · 70% nodig om te slagen

1. Wat doet `continue` in een lus?
2. Hoe vaak wordt de binnenste print uitgevoerd bij `for a in range(3):` met daarin `for b in range(4): print(a, b)`?
3. Een `break` staat in de binnenste van twee geneste lussen. Wat stopt er?
4. Waarom is `while True:` niet per se een fout?
5. Wat doet `print("x", end="")`?