Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

modul:m323:learningunits:lu01:loesungen:prozedurzufunktion [2026/08/18 10:08] – Neue Loesung LU01.L09 - Vom Skript zur Funktion adminmodul:m323:learningunits:lu01:loesungen:prozedurzufunktion [2026/08/18 11:11] (aktuell) – Musterloesung via gh-Import aus dem solution-Branch admin
Zeile 3: Zeile 3:
 ===== 1. Analyse der Ausgangslage ===== ===== 1. Analyse der Ausgangslage =====
  
-Alle drei ''def''-Blöcke sind **Prozeduren**:+Alle drei ''def''-Blöcke in ''ausgangslage.py'' sind **Prozeduren**:
  
 ^ Block ^ Warum Prozedur? ^ ^ Block ^ Warum Prozedur? ^
Zeile 14: Zeile 14:
 ===== 2. Musterlösung ===== ===== 2. Musterlösung =====
  
-<code python> +~~NOCACHE~~ 
-def artikel_hinzufuegen(lager, name, menge, preis): +=== main.py === 
-    """Gibt ein NEUES Lager mit dem zusätzlichen Artikel zurück.""" +{{gh>https://github.com/templates-python/m323-lu01-a09-lager-funktional/blob/solution/main.py}}
-    return lager + [{"name"name, "menge": menge, "preis": preis}]+
  
 +<WRAP center round info 80%>
 +**Zum ''+'' in ''artikel_hinzufuegen''**
  
-def gesamtwert(lager): +''lager + [neuer_artikel]'' erzeugt eine **neue** Liste, ''lager.append(...)'' verändert die bestehende. Genau darin liegt der Unterschied zwischen der funktionalen und der prozeduralen Variante.
-    """Berechnet den Gesamtwert aller Artikel im Lager.""" +
-    total = 0 +
-    for artikel in lager: +
-        total += artikel["menge"] * artikel["preis"+
-    return total+
  
 +Der Preis: Die aufrufende Stelle muss das Ergebnis auffangen (''lager = artikel_hinzufuegen(...)''). Wer das vergisst, verliert den neuen Artikel – dafür kann er aber nie versehentlich fremde Daten beschädigen.
 +</WRAP>
  
-def teuerster_artikel(lager): +===== 3Die Tests, die den Kern treffen =====
-    """Gibt den teuersten Artikel zurück, bei leerem Lager None.""" +
-    if not lager: +
-        return None +
-    teuerster lager[0] +
-    for artikel in lager[1:]: +
-        if artikel["preis"] > teuerster["preis"]: +
-            teuerster artikel +
-    return teuerster+
  
 +Zwei der neun Tests prüfen genau das, worum es didaktisch geht:
  
-def formatiere_gesamtwert(lager): +=== main_test.py === 
-    """Erzeugt den Ausgabetext - gibt ihn zurück, statt ihn zu drucken.""" +{{gh>https://github.com/templates-python/m323-lu01-a09-lager-funktional/blob/solution/main_test.py}}
-    return f"Gesamtwert: {gesamtwert(lager):.2fCHF"+
  
 +  * ''test_artikel_hinzufuegen_veraendert_original_nicht'' fällt durch, sobald jemand ''append'' auf der übergebenen Liste verwendet.
 +  * ''test_keine_ausgabe_in_berechnung'' fällt durch, sobald eine berechnende Funktion druckt oder ''None'' liefert.
  
-if __name__ == '__main__': +Dazu kommt das LintingEin ''global'' in ''main.py'' löst ''W0603 global-statement'' aus und kostet Punkte.
-    lager = [] +
-    lager = artikel_hinzufuegen(lager, 'Maus', 10, 24.90) +
-    lager = artikel_hinzufuegen(lager, 'Tastatur', 4, 79.50) +
-    lager = artikel_hinzufuegen(lager, 'Monitor', 2, 249.00) +
- +
-    print(formatiere_gesamtwert(lager))              # Gesamtwert: 1065.00 CHF +
-    print(f"Teuerster Artikel: {teuerster_artikel(lager)['name']}" # Monitor +
- +
-    # Nachweis 1: derselbe Aufruf liefert immer dasselbe Ergebnis +
-    print(gesamtwert(lager) == gesamtwert(lager))    # True +
- +
-    # Nachweis 2: das Original bleibt unverändert +
-    erweitert = artikel_hinzufuegen(lager, 'Dock', 1, 189.00) +
-    print(len(lager), len(erweitert))                # 3 4 +
- +
-    # Randfallleeres Lager +
-    print(teuerster_artikel([]))                     # None +
-</code> +
- +
-<WRAP center round info 80%> +
-**Zum ''+'' in ''artikel_hinzufuegen''** +
- +
-''lager + [neuer_artikel]'' erzeugt eine **neue** Liste, ''lager.append(...)'' verändert die bestehende. Genau darin liegt der Unterschied zwischen der funktionalen und der prozeduralen Variante. +
- +
-Der Preis: Die aufrufende Stelle muss das Ergebnis auffangen (''lager = artikel_hinzufuegen(...)''). Wer das vergisst, verliert den neuen Artikel – dafür kann er aber nie versehentlich fremde Daten beschädigen. +
-</WRAP>+
  
-===== 3. Antworten auf die Kontrollfragen =====+===== 4. Antworten auf die Kontrollfragen =====
  
 ==== Frage 1: Ersetzbarkeit ==== ==== Frage 1: Ersetzbarkeit ====
Zeile 95: Zeile 61:
 <code python> <code python>
 def test_gesamtwert(): def test_gesamtwert():
-    lager = [{"name""A""menge": 2, "preis": 10.0}]+    lager = [{'name''A''menge': 2, 'preis': 10.0}]
     assert gesamtwert(lager) == 20.0     assert gesamtwert(lager) == 20.0
  
  • modul/m323/learningunits/lu01/loesungen/prozedurzufunktion.1787040519.txt.gz
  • Zuletzt geändert: 2026/08/18 10:08
  • von admin