Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| modul:m323:learningunits:lu07:loesungen:langefunktion [2026/09/09 11:14] – LU07.L04 - Lange Funktion zerlegen (neu) admin | modul:m323:learningunits:lu07:loesungen:langefunktion [2026/09/09 13:39] (aktuell) – L04 korrigiert: sum() braucht Startwert 0.0, sonst Total 0 statt 0.0 bei leerer Liste admin | ||
|---|---|---|---|
| Zeile 4: | Zeile 4: | ||
| <code python> | <code python> | ||
| - | # test_bericht.py | + | # main_test.py |
| - | from bericht | + | import |
| ERWARTET = ( | ERWARTET = ( | ||
| Zeile 18: | Zeile 18: | ||
| ) | ) | ||
| - | def test_bericht_bleibt_gleich(): | + | def test_bericht_unveraendert(): |
| - | assert bericht(BESTELLUNGEN) == ERWARTET | + | assert |
| - | def test_stornierte_werden_ignoriert(): | + | def test_rabatt_erst_ab_100(): |
| - | nur_storno = [b for b in BESTELLUNGEN if b[" | + | |
| - | assert " | + | |
| - | + | ||
| - | def test_rabattgrenze(): | + | |
| knapp_darunter = [{" | knapp_darunter = [{" | ||
| - | assert "= 99.0 CHF" in bericht(knapp_darunter) | + | assert "a = 99.0 CHF" in main.bericht(knapp_darunter) |
| + | |||
| + | def test_rabatt_ab_100_inklusive(): | ||
| + | genau_100 = [{" | ||
| + | assert "a = 95.0 CHF" in main.bericht(genau_100) | ||
| + | |||
| + | def test_leere_liste(): | ||
| + | assert main.bericht([]) == ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | | ||
| </ | </ | ||
| Zeile 35: | Zeile 43: | ||
| RABATT_AB_BETRAG = 100 | RABATT_AB_BETRAG = 100 | ||
| RABATT_PROZENT = 5 | RABATT_PROZENT = 5 | ||
| + | STATUS_STORNIERT = " | ||
| def ist_gueltig(bestellung): | def ist_gueltig(bestellung): | ||
| - | return bestellung[" | + | return bestellung[" |
| Zeile 53: | Zeile 62: | ||
| def zeile(bestellung): | def zeile(bestellung): | ||
| - | return f" | + | |
| + | | ||
| def bericht(bestellungen): | def bericht(bestellungen): | ||
| gueltige = [b for b in bestellungen if ist_gueltig(b)] | gueltige = [b for b in bestellungen if ist_gueltig(b)] | ||
| - | total = round(sum(zeilenwert(b) for b in gueltige), 2) | + | |
| + | | ||
| kopf = f" | kopf = f" | ||
| strich = " | strich = " | ||
| Zeile 71: | Zeile 82: | ||
| refactor: Zeilenwert in zeilenwert() extrahiert | refactor: Zeilenwert in zeilenwert() extrahiert | ||
| refactor: Namensaufbereitung in kundenname() extrahiert | refactor: Namensaufbereitung in kundenname() extrahiert | ||
| + | refactor: Zeilenformatierung in zeile() extrahiert | ||
| refactor: Schleife durch Comprehension und sum() ersetzt | refactor: Schleife durch Comprehension und sum() ersetzt | ||
| refactor: String-Verkettung durch f-Strings ersetzt | refactor: String-Verkettung durch f-Strings ersetzt | ||
| </ | </ | ||
| + | |||
| + | ===== Die Falle in dieser Aufgabe ===== | ||
| + | |||
| + | <WRAP center round important 90%> | ||
| + | Der naheliegende Umbau | ||
| + | |||
| + | <code python> | ||
| + | total = round(sum(zeilenwert(b) for b in gueltige), 2) | ||
| + | </ | ||
| + | |||
| + | ist **falsch**. Bei einer leeren Liste liefert '' | ||
| + | |||
| + | <code python> | ||
| + | total = round(sum((zeilenwert(b) for b in gueltige), 0.0), 2) | ||
| + | </ | ||
| + | |||
| + | Der Test '' | ||
| + | </ | ||
| ===== Worauf es ankommt ===== | ===== Worauf es ankommt ===== | ||
| Zeile 80: | Zeile 110: | ||
| * Die Rabattregel steht an einer Stelle und heisst so, wie die Fachabteilung sie nennt. | * Die Rabattregel steht an einer Stelle und heisst so, wie die Fachabteilung sie nennt. | ||
| * '' | * '' | ||
| - | * Der Test '' | + | * Die Tests '' |
| - | <WRAP center round important | + | <WRAP center round tip 80%> |
| - | **Häufiger Fehler:** '' | + | **Zweite Stolperstelle:** '' |
| </ | </ | ||