Zum Inhalt springen
aviral gupta

// B2.5 · ca. 40 Min. · Einstieg

Projekt: FizzBuzz-Varianten und ein Menü mit match

Nach diesem Projekt kombinieren Sie alle Werkzeuge aus Modul B2 in einem Programm: FizzBuzz und seine Varianten sowie ein Textmenü, das mit while True wiederholt und Befehle mit match auswählt.

Lektion 5 von 5 in B2 Kontrollfluss

Ende des Moduls

Danach können Sie

  • FizzBuzz und seine Varianten mit for, range, if und match schreiben
  • Ein Textmenü mit while True, match, break und continue steuern
  • Die typischen Fehler solcher Programme erkennen: Reihenfolge, range um eins daneben und Text in Guards
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen aus Modul B2: Welche Aussagen stimmen? Wählen Sie alle zutreffenden.

    Wählen Sie alle zutreffenden aus.

  2. Vorhersagen · Aufgabe 2 von 7

    Eine FizzBuzz-Variante. Sagen Sie es vorher, bevor Sie weiterlesen: Was gibt das aus?

    for i in range(1, 7):
        if i % 3 == 0:
            print("Fizz", end=" ")
        elif i % 2 == 0:
            print("Even", end=" ")
        else:
            print(i, end=" ")
  3. Üben · Aufgabe 3 von 7

    Setzen Sie das Muster ein, das auf jeden Rest passt, ohne einen Namen zu binden, damit 9 Fizz ausgibt.

    for i in [15, 9, 10, 7]:
        match [i % 3, i % 5]:
            case [0, 0]:
                print("FizzBuzz")
            case [0, ____]:
                print("Fizz")
            case [_, 0]:
                print("Buzz")
            case _:
                print(i)
    case [0, ]:
  4. Üben · Aufgabe 4 von 7

    Eine Menüschleife über eine Befehlsliste. Was gibt das aus?

    log = []
    for command in ["help", "", "add", "quit", "add"]:
        match command:
            case "":
                continue
            case "quit":
                break
            case "help" | "?":
                log.append("help")
            case _:
                log.append(command)
    print(log)
  5. Üben · Aufgabe 5 von 7

    Bringen Sie die Schritte einer Runde einer Menüschleife in die richtige Reihenfolge.

    1. 1.Den Befehl ausführen oder im quit-Fall break
    2. 2.Eine Zeile lesen und in Wörter zerlegen
    3. 3.Die Wortliste mit den Befehlsmustern vergleichen
    4. 4.Die Runde beginnen: while True:
  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Was gibt die letzte Zeile nach der Schleife aus?

    for i in range(1, 16):
        match [i % 3, i % 5]:
            case [0, _]:
                word = "Fizz"
            case [_, 0]:
                word = "Buzz"
            case [0, 0]:
                word = "FizzBuzz"
            case _:
                word = ""
    print(word)
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe. Erweitern Sie FizzBuzz um eine dritte Regel: Vielfache von 7 hängen Bazz an. Die Wörter werden kombiniert, 21 ergibt also FizzBazz und 105 FizzBuzzBazz. Lesen Sie n mit int(input()) und geben Sie für jede Zahl von 1 bis n eine Zeile aus. Tipp: Bauen Sie das Wort mit drei getrennten if.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Ein FizzBuzz-Labor mit Menü

Dieses Programm bringt das ganze Modul zusammen. Ein while-True-Menü liest Befehle: help, fizzbuzz N gibt FizzBuzz bis N mit match aus, first N sucht das erste FizzBuzz mit break und else an der Schleife, quit beendet das Programm. Leere Zeilen werden übersprungen, und ein Guard mit isdigit() weist Argumente ab, die keine Zahlen sind. Die Eingabe unten liefert sieben Zeilen; ändern Sie sie und starten Sie erneut.

main.py

# A small FizzBuzz lab, driven by a menu. Each input line is one command.
while True:
    words = input().split()
    match words:
        case []:
            continue  # an empty line: ask again
        case ["quit" | "q"]:
            print("Bye!")
            break
        case ["help"]:
            print("Commands: fizzbuzz N, first N, help, quit")
        case ["fizzbuzz", n] if n.isdigit():
            for i in range(1, int(n) + 1):
                match [i % 3, i % 5]:
                    case [0, 0]:
                        print("FizzBuzz", end=" ")
                    case [0, _]:
                        print("Fizz", end=" ")
                    case [_, 0]:
                        print("Buzz", end=" ")
                    case _:
                        print(i, end=" ")
            print()
        case ["first", n] if n.isdigit():
            # The first number up to n that is a FizzBuzz, if there is one.
            for i in range(1, int(n) + 1):
                if i % 15 == 0:
                    print("First FizzBuzz:", i)
                    break
            else:
                print("No FizzBuzz up to", n)
        case [command, *_]:
            print("Unknown command:", command)

input.txt

help
fizzbuzz 15

first 10
first 40
fizzbuzz ten
quit

Ausführen mit

python main.py < input.txt

Ausgabe

Commands: fizzbuzz N, first N, help, quit
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
No FizzBuzz up to 10
First FizzBuzz: 15
Unknown command: fizzbuzz
Bye!
  • Die leere dritte Zeile ergibt [], also macht case [] ohne Ausgabe weiter.
  • first 10 findet kein Vielfaches von 15, die Schleife endet ohne break, und ihr else läuft.
  • fizzbuzz ten scheitert am Guard mit isdigit(), also fällt match bis case [command, *_] durch.
  • Das print() nach der inneren Schleife beendet die Zeile, die end=" " offen gelassen hat.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Übungen

Übung 1 von 3

Schritt 1: klassisches FizzBuzz

Das Programm liest eine ganze Zahl n. Geben Sie die Zahlen von 1 bis n aus, eine pro Zeile, aber Fizz für Vielfache von 3, Buzz für Vielfache von 5 und FizzBuzz für Vielfache von beiden. Verwenden Sie if und elif oder match auf [i % 3, i % 5]. Bei 0 erscheint nichts.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Entscheiden Sie in der Schleife mit einer if-, elif- und else-Kette, was für i erscheint.

  2. Hinweis 2

    Prüfen Sie zuerst auf beide: i % 15 == 0 (oder i % 3 == 0 and i % 5 == 0), sonst bleibt 15 bei Fizz hängen.

  3. Hinweis 3

    Mit match: match [i % 3, i % 5]:, dann case [0, 0]:, case [0, _]:, case [_, 0]: und case _:.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

n = int(input())

for i in range(1, n + 1):
    if i % 15 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

n = int(input())

for i in range(1, n + 1):
    # Replace multiples of 3 with Fizz, of 5 with Buzz, of both with FizzBuzz.
    print(i)

test_main.py

from learnrun import run_main


def fizzbuzz(n):
    return run_main(f"{n}\n").split()


def test_first_five():
    """1 bis 5: 1 2 Fizz 4 Buzz"""
    got = fizzbuzz(5)
    assert got == ["1", "2", "Fizz", "4", "Buzz"], f"bei 5 gab das Programm {got!r} aus"


def test_fifteen():
    """15 ist FizzBuzz, nicht Fizz"""
    got = fizzbuzz(15)
    assert len(got) == 15, f"bei 15 gab das Programm {len(got)} Zeilen aus, erwartet: 15"
    assert got[-1] == "FizzBuzz", f"die 15. Zeile ist {got[-1]!r}, erwartet: 'FizzBuzz' (prüfen Sie die Reihenfolge Ihrer Bedingungen)"


def test_to_thirty():
    """Zeilen 25 bis 30 sind Buzz 26 Fizz 28 29 FizzBuzz"""
    got = fizzbuzz(30)[24:]
    assert got == ["Buzz", "26", "Fizz", "28", "29", "FizzBuzz"], f"die Zeilen 25 bis 30 sind {got!r}"


def test_zero():
    """Bei 0 erscheint nichts"""
    got = fizzbuzz(0)
    assert got == [], f"bei 0 gab das Programm {got!r} aus, erwartet: nichts"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Übung 2 von 3

Schritt 2: beim ersten FizzBuzz aufhören

Ändern Sie FizzBuzz für n so, dass es direkt nach dem ersten FizzBuzz aufhört: Danach erscheint nichts mehr. Erreicht die Schleife n ohne ein FizzBuzz, geben Sie als letzte Zeile no FizzBuzz aus. Verwenden Sie match auf [i % 3, i % 5], break und else an der for-Schleife.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    break in einem case beendet die for-Schleife um das match.

  2. Hinweis 2

    Setzen Sie break direkt nach print("FizzBuzz") in denselben Fall.

  3. Hinweis 3

    Schreiben Sie else: print("no FizzBuzz") auf der Einrückung von for: Es läuft nur, wenn kein break passiert ist.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

n = int(input())

for i in range(1, n + 1):
    match [i % 3, i % 5]:
        case [0, 0]:
            print("FizzBuzz")
            break
        case [0, _]:
            print("Fizz")
        case [_, 0]:
            print("Buzz")
        case _:
            print(i)
else:
    print("no FizzBuzz")
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

n = int(input())

for i in range(1, n + 1):
    match [i % 3, i % 5]:
        case [0, 0]:
            print("FizzBuzz")
        case [0, _]:
            print("Fizz")
        case [_, 0]:
            print("Buzz")
        case _:
            print(i)
# Stop after the first FizzBuzz; otherwise print "no FizzBuzz".

test_main.py

from learnrun import run_main


def lines(n):
    return run_main(f"{n}\n").splitlines()


def test_stops_at_fifteen():
    """Bei 20 endet es nach Zeile 15, FizzBuzz"""
    got = lines(20)
    assert len(got) == 15, f"bei 20 gab das Programm {len(got)} Zeilen aus, erwartet: 15"
    assert got[-1] == "FizzBuzz", f"die letzte Zeile ist {got[-1]!r}, erwartet: 'FizzBuzz'"


def test_no_fizzbuzz():
    """Bei 7 erscheinen alle sieben Zeilen, dann no FizzBuzz"""
    got = lines(7)
    assert got == ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "no FizzBuzz"], f"bei 7 gab das Programm {got!r} aus"


def test_exactly_fifteen():
    """Bei 15 bricht die Schleife ab, no FizzBuzz erscheint also nicht"""
    got = lines(15)
    assert "no FizzBuzz" not in got, "bei 15 gab das Programm 'no FizzBuzz' aus, obwohl es eins gefunden hat"
    assert got[-1] == "FizzBuzz", f"die letzte Zeile ist {got[-1]!r}, erwartet: 'FizzBuzz'"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Übung 3 von 3

Schritt 3: ein Rechner-Menü

Bauen Sie ein Menü mit einer Summe, die bei 0 beginnt. Lesen Sie Zeilen bis quit. add N und sub N ändern die Summe, wenn N eine ganze Zahl ist (prüfen Sie N.isdigit() in einem Guard). show gibt die Summe aus. quit gibt bye aus und endet. Überspringen Sie leere Zeilen; bei allem anderen erscheint unknown command.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Jede Runde: words = input().split(), dann match words: mit einem Fall pro Befehl.

  2. Hinweis 2

    case ["add", n] if n.isdigit(): läuft nur, wenn n eine Zahl ist; "add x" fällt dann bis case _ durch.

  3. Hinweis 3

    case []: continue überspringt leere Zeilen; case ["quit"]: gibt bye aus und bricht ab.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

total = 0

while True:
    words = input().split()
    match words:
        case []:
            continue
        case ["add", n] if n.isdigit():
            total = total + int(n)
        case ["sub", n] if n.isdigit():
            total = total - int(n)
        case ["show"]:
            print(total)
        case ["quit"]:
            print("bye")
            break
        case _:
            print("unknown command")
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

total = 0

while True:
    words = input().split()
    # Match words: add N, sub N, show, quit, an empty line, anything else.
    break

test_main.py

from learnrun import run_main


def menu(*commands):
    return run_main("\n".join(commands) + "\n").splitlines()


def test_add_and_show():
    """add 5, add 3, show gibt 8 aus"""
    got = menu("add 5", "add 3", "show", "quit")
    assert got == ["8", "bye"], f"das Programm gab {got!r} aus, erwartet: ['8', 'bye']"


def test_sub():
    """add 10, sub 4, show gibt 6 aus"""
    got = menu("add 10", "sub 4", "show", "quit")
    assert got == ["6", "bye"], f"das Programm gab {got!r} aus, erwartet: ['6', 'bye']"


def test_empty_lines():
    """Leere Zeilen werden übersprungen; die Summe beginnt bei 0"""
    got = menu("", "show", "", "quit")
    assert got == ["0", "bye"], f"das Programm gab {got!r} aus, erwartet: ['0', 'bye']"


def test_unknown():
    """Unbekannte Befehle und Nicht-Zahlen werden abgewiesen"""
    got = menu("jump", "add x", "add", "quit")
    assert got == ["unknown command"] * 3 + ["bye"], f"das Programm gab {got!r} aus"


def test_quit_stops():
    """Nach quit wird nichts mehr gelesen"""
    got = menu("quit", "add 1", "show")
    assert got == ["bye"], f"das Programm gab {got!r} aus, erwartet nur: ['bye']"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Häufige Fehler

Eine Zahl an Text hängen

i = 3
print("Fizz" + i)

Was Python ausgibt

TypeError: can only concatenate str (not "int") to str

Warum, und die Lösung

+ verbindet zwei Strings oder addiert zwei Zahlen, aber nicht eins von jedem. Geben Sie beides nebeneinander aus, print("Fizz", i), oder machen Sie die Zahl zuerst mit str(i) zu Text.

Die ganze Zeile umwandeln

line = "add 5"  # what input() gives you
n = int(line)

Was Python ausgibt

ValueError: invalid literal for int() with base 10: 'add 5'

Warum, und die Lösung

int() braucht Text, der nur aus einer Zahl besteht. Zerlegen Sie die Zeile zuerst und wandeln Sie nur das Argument um: words = line.split(), dann int(words[1]), oder fangen Sie es mit case ["add", n]: ein und rufen int(n) auf.

Eingefangenen Text mit einer Zahl vergleichen

match "add 5".split():
    case ["add", n] if n > 0:
        print("adding", n)

Was Python ausgibt

TypeError: '>' not supported between instances of 'str' and 'int'

Warum, und die Lösung

Muster fangen die Teile einer zerlegten Zeile als Strings ein, n ist also "5", nicht 5. Wandeln Sie im Guard um, if int(n) > 0, und prüfen Sie zuerst n.isdigit(), wenn der Text keine Zahl sein könnte: if n.isdigit() and int(n) > 0.

Python im Browser: Pyodide 314.0.7, MPL-2.0. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

FizzBuzz auf zwei Arten

FizzBuzz gibt die Zahlen von 1 bis n aus, aber Fizz für Vielfache von 3, Buzz für Vielfache von 5 und FizzBuzz für Vielfache von beiden. Mit if und elif muss die Prüfung auf beide zuerst kommen, sonst bleibt 15 bei Fizz hängen. Mit match vergleichen Sie das Paar der Reste: case [0, 0]: ist FizzBuzz, case [0, _]: ist Fizz, case [_, 0]: ist Buzz. Eine dritte Art baut das Wort: "Fizz" und "Buzz" mit zwei getrennten if anhängen, dann print(word or i).

Eine Menüschleife

Ein Textmenü wiederholt sich, bis beendet wird, ist also eine while True:-Schleife. Jede Runde liest eine Zeile, zerlegt sie in Wörter und vergleicht die Liste. Eine leere Zeile ergibt [], die case []: mit continue überspringen kann. case ["quit"]: verabschiedet sich und beendet die Schleife mit break. Befehle mit Argument wie ["add", n] fangen das Argument als Text ein; ein Guard wie if n.isdigit() prüft es, bevor int(n) läuft. case _: beantwortet alles andere.

Wo solche Programme meist schiefgehen

Reihenfolge: Eine weitere Bedingung oder ein weiteres Muster vor einem engeren verdeckt es, und ein Platzhalter oder bloßer Name vor anderen Fällen ist ein SyntaxError. Bereiche: range(1, n) hört bei n - 1 auf, die letzte Zahl braucht also range(1, n + 1). Text und Zahlen: input() und split() liefern Strings, daher scheitern "Fizz" + i, int("add 5") und n > 0 mit einem String. Wandeln Sie zuerst um und prüfen Sie mit isdigit(), wenn der Text keine Zahl sein könnte.

Quellen

Zuletzt geprüft am 29. September 2026