Aufwärmen · Aufgabe 1 von 7
// 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
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
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=" ")Ü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, ]:Ü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)Üben · Aufgabe 5 von 7
Bringen Sie die Schritte einer Runde einer Menüschleife in die richtige Reihenfolge.
- 1.Den Befehl ausführen oder im quit-Fall break
- 2.Eine Zeile lesen und in Wörter zerlegen
- 3.Die Wortliste mit den Befehlsmustern vergleichen
- 4.Die Runde beginnen: while True:
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)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.txtAusgabe
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
Hinweis 1
Entscheiden Sie in der Schleife mit einer if-, elif- und else-Kette, was für i erscheint.
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.
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.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.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
Hinweis 1
break in einem case beendet die for-Schleife um das match.
Hinweis 2
Setzen Sie break direkt nach print("FizzBuzz") in denselben Fall.
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.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.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
Hinweis 1
Jede Runde: words = input().split(), dann match words: mit einem Fall pro Befehl.
Hinweis 2
case ["add", n] if n.isdigit(): läuft nur, wenn n eine Zahl ist; "add x" fällt dann bis case _ durch.
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.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.py herunterladenHäufige Fehler
Eine Zahl an Text hängen
i = 3
print("Fizz" + i)
Was Python ausgibt
TypeError: can only concatenate str (not "int") to strWarum, 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.