LU07.A04 - Lange Funktion zerlegen

Zerlegen Sie die Funktion bericht in benannte Teilfunktionen. Die Ausgabe muss zeichengenau dieselbe bleiben.

BESTELLUNGEN = [
    {"kunde": "  Meier ", "artikel": "Maus",     "menge": 3, "preis": 25.0,   "status": "offen"},
    {"kunde": "keller",   "artikel": "Laptop",   "menge": 1, "preis": 1200.0, "status": "bezahlt"},
    {"kunde": "MEIER",    "artikel": "Tastatur", "menge": 2, "preis": 80.0,   "status": "bezahlt"},
    {"kunde": "Suter",    "artikel": "USB-Hub",  "menge": 5, "preis": 12.0,   "status": "storniert"},
    {"kunde": "keller ",  "artikel": "Monitor",  "menge": 1, "preis": 210.0,  "status": "offen"},
]
 
 
def bericht(bestellungen):
    zeilen = []
    total = 0.0
    anzahl = 0
    for b in bestellungen:
        if b["status"] != "storniert":
            wert = b["menge"] * b["preis"]
            if wert >= 100:
                wert = wert * 0.95
            total = total + wert
            anzahl = anzahl + 1
            name = b["kunde"].strip().lower().capitalize()
            zeilen.append(name + ": " + b["artikel"] + " = " + str(round(wert, 2)) + " CHF")
    kopf = "Bestellungen (" + str(anzahl) + ")"
    strich = "-" * len(kopf)
    fuss = "Total: " + str(round(total, 2)) + " CHF"
    return "\n".join([kopf, strich] + zeilen + [strich, fuss])

Die Funktion liefert:

Bestellungen (4)
----------------
Meier: Maus = 75.0 CHF
Keller: Laptop = 1140.0 CHF
Meier: Tastatur = 152.0 CHF
Keller: Monitor = 199.5 CHF
----------------
Total: 1566.5 CHF
  1. Sicherheitsnetz prüfen: pytest ausführen. Alle sechs Tests sind grün, bevor Sie irgendetwas ändern.
  2. Wenden Sie mindestens vier Techniken aus LU07c an. Erwartet werden: Extract Function, Named Constant, Replace Loop with Pipeline, sprechende Namen.
  3. Nach jedem einzelnen Umbau: Test laufen lassen und committen. Die Commit-Message nennt die Technik, zum Beispiel refactor: Rabattgrenze als Konstante benannt.
  4. Am Schluss darf keine Funktion länger als etwa zehn Zeilen sein.
  • main_test.py wird nicht verändert. Wer den Test anpasst, damit er grün wird, hat die Aufgabe nicht gelöst.
  • Die Namen BESTELLUNGEN und bericht bleiben erhalten.
  • Neue Hilfsfunktionen dürfen Sie frei benennen.
Teil Punkte
Tests (main_test.py) 8
pylint (main.py) 5

Diese Aufgabe erzeugt genau das Material, das im Portfolio (LB02) für D1I verlangt wird: Vorher/Nachher aus der Commit-Historie, gleiches Verhalten per Test belegt.

Die Beispieldaten sind nicht der einzige Testfall. Denken Sie an die leere Liste und an die Rabattgrenze bei genau 100 Franken - dort passieren beim Umbau die meisten stillen Verhaltensänderungen.


© Kevin Maurizi

  • modul/m323/learningunits/lu07/aufgaben/langefunktion.txt
  • Zuletzt geändert: 2026/09/09 13:52
  • von admin