| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
| modul:m323:learningunits:lu01:aufgaben:prozedurzufunktion [2026/08/18 10:20] – Kompetenz-Tags auf neue Kompetenzmatrix ZH gesetzt admin | modul:m323:learningunits:lu01:aufgaben:prozedurzufunktion [2026/08/18 11:20] (aktuell) – Kontrollfragen werden neu im README.md abgegeben admin |
|---|
| ===== Ausgangslage ===== | ===== Ausgangslage ===== |
| |
| Das folgende Skript funktioniert – solange man es genau in dieser Reihenfolge aufruft. Es zeigt gleich mehrere typische Schwächen prozeduralen Codes: globalen Zustand, Berechnung und Ausgabe im selben Atemzug, und Prozeduren, die ''None'' zurückgeben. | Das Skript in ''ausgangslage.py'' funktioniert – solange man es genau in dieser Reihenfolge aufruft. Es zeigt gleich mehrere typische Schwächen prozeduralen Codes: globalen Zustand, Berechnung und Ausgabe im selben Atemzug, und Prozeduren, die ''None'' zurückgeben. |
| |
| <code python> | ~~NOCACHE~~ |
| lager = [] | === ausgangslage.py === |
| gesamtwert = 0 | {{gh>https://github.com/templates-python/m323-lu01-a09-lager-funktional/blob/main/ausgangslage.py}} |
| |
| | ===== Code-Vorlage ===== |
| |
| def artikel_hinzufuegen(name, menge, preis): | Die Namen und Signaturen in ''main.py'' sind fix – die Tests rufen genau diese auf. |
| global gesamtwert | |
| lager.append({"name": name, "menge": menge, "preis": preis}) | |
| gesamtwert += menge * preis | |
| |
| | === main.py === |
| def zeige_gesamtwert(): | {{gh>https://github.com/templates-python/m323-lu01-a09-lager-funktional/blob/main/main.py}} |
| print(f"Gesamtwert: {gesamtwert:.2f} CHF") | |
| | |
| | |
| def zeige_teuersten(): | |
| teuerster = None | |
| for artikel in lager: | |
| if teuerster is None or artikel["preis"] > teuerster["preis"]: | |
| teuerster = artikel | |
| print(f"Teuerster Artikel: {teuerster['name']}") | |
| | |
| | |
| if __name__ == '__main__': | |
| artikel_hinzufuegen('Maus', 10, 24.90) | |
| artikel_hinzufuegen('Tastatur', 4, 79.50) | |
| artikel_hinzufuegen('Monitor', 2, 249.00) | |
| zeige_gesamtwert() | |
| zeige_teuersten() | |
| </code> | |
| |
| ===== Anforderungen ===== | ===== Anforderungen ===== |
| |
| - **Analyse:** Halten Sie schriftlich fest, welche der drei ''def''-Blöcke Prozeduren sind und woran Sie das erkennen. | - **Analyse:** Halten Sie fest, welche der drei ''def''-Blöcke in ''ausgangslage.py'' Prozeduren sind und woran Sie das erkennen. |
| - **Umbau:** Schreiben Sie das Skript so um, dass gilt: | - **Umbau:** Implementieren Sie in ''main.py'' die vier vorgegebenen Funktionen so, dass gilt: |
| * Keine globalen Variablen – alle benötigten Daten kommen als Parameter herein. | * Keine globalen Variablen – alle benötigten Daten kommen als Parameter herein. |
| * Kein ''print'' innerhalb der berechnenden Funktionen. Ausgegeben wird ausschliesslich im ''main''-Block. | * Kein ''print'' innerhalb der berechnenden Funktionen. Ausgegeben wird ausschliesslich in ''main()''. |
| * Jede Funktion gibt einen Wert zurück. | * Jede Funktion gibt einen Wert zurück. |
| * ''artikel_hinzufuegen'' verändert die übergebene Liste **nicht**, sondern gibt eine **neue** Liste zurück. | * ''artikel_hinzufuegen'' verändert die übergebene Liste **nicht**, sondern gibt eine **neue** Liste zurück. |
| - **Nachweis:** Zeigen Sie mit ''print''-Aufrufen, dass ''gesamtwert(lager)'' zweimal hintereinander aufgerufen dasselbe Ergebnis liefert und dass die ursprüngliche Liste nach ''artikel_hinzufuegen'' unverändert ist. | |
| - **Randfall:** Überlegen Sie, was ''teuerster_artikel'' bei einem leeren Lager zurückgeben soll, und setzen Sie es um. | ^ Funktion ^ Rückgabe ^ |
| | | ''artikel_hinzufuegen(lager, name, menge, preis)'' | eine **neue** Liste mit dem zusätzlichen Artikel | |
| | | ''gesamtwert(lager)'' | Summe aus Menge mal Preis, bei leerem Lager ''0'' | |
| | | ''teuerster_artikel(lager)'' | der Artikel mit dem höchsten Preis, bei leerem Lager ''None'' | |
| | | ''formatiere_gesamtwert(lager)'' | Text im Format ''Gesamtwert: 1065.00 CHF'' | |
| |
| ==== Beispieloutput ==== | ==== Beispieloutput ==== |
| |
| ===== Kontrollfragen ===== | ===== Kontrollfragen ===== |
| | |
| | Diese drei Fragen beantworten Sie **direkt im ''README.md''** Ihres Repositories, unterhalb der jeweiligen Frage. Zwei bis vier Sätze pro Frage genügen. |
| |
| - Warum kann man den Ausdruck ''gesamtwert(lager)'' im Kopf jederzeit durch seine Zahl ersetzen, den Aufruf ''artikel_hinzufuegen('Maus', 10, 24.90)'' aus der Ausgangslage aber nicht? Wie heisst diese Eigenschaft? | - Warum kann man den Ausdruck ''gesamtwert(lager)'' im Kopf jederzeit durch seine Zahl ersetzen, den Aufruf ''artikel_hinzufuegen('Maus', 10, 24.90)'' aus der Ausgangslage aber nicht? Wie heisst diese Eigenschaft? |
| Schleifen sind in dieser Aufgabe ausdrücklich erlaubt – innerhalb einer Funktion ist eine ''for''-Schleife völlig in Ordnung. Es geht hier nicht um den schleifenfreien Stil, sondern um die Grenze zwischen **Funktion** und **Prozedur**: Liefert der Block einen Wert, oder //tut// er etwas? | Schleifen sind in dieser Aufgabe ausdrücklich erlaubt – innerhalb einer Funktion ist eine ''for''-Schleife völlig in Ordnung. Es geht hier nicht um den schleifenfreien Stil, sondern um die Grenze zwischen **Funktion** und **Prozedur**: Liefert der Block einen Wert, oder //tut// er etwas? |
| </WRAP> | </WRAP> |
| | |
| | <WRAP center round important 80%> |
| | **Achtung beim Linting** |
| | |
| | ''global'' kostet in dieser Aufgabe Punkte (''W0603 global-statement'' ist bewusst aktiviert) – genau darum geht es ja. |
| | </WRAP> |
| | |
| | ===== Vorgehen ===== |
| | |
| | - Akzeptiere das Classroom-Assignment |
| | - Klone dein persönliches Repository in die Entwicklungsumgebung |
| | - Lies ''ausgangslage.py'' |
| | - Implementiere die vier Funktionen in ''main.py'' |
| | - Beantworte die drei Kontrollfragen im ''README.md'' |
| | - Lokal prüfen mit ''pytest'' und ''python _run_pylint.py'' |
| | - Pushen – Code und Antworten liegen damit im selben Commit |
| | |
| | ===== Bewertung ===== |
| | |
| | ^ Teil ^ Punkte ^ |
| | | Unittests | 11 | |
| | | Linting | 5 | |
| | | Kontrollfragen (von Hand bewertet) | 4 | |
| | | **Total** | **20** | |
| |
| ===== Abgabe ===== | ===== Abgabe ===== |
| |
| Geben Sie die Python-Datei und die beantworteten Kontrollfragen in Moodle ab. | Alles zusammen als Push in das persönliche GitHub-Repository: der Code in ''main.py'' und die Antworten auf die Kontrollfragen im ''README.md''. Es gibt keine separate Moodle-Abgabe. |
| |
| ---- | ---- |
| {{tag>M323-LU01 M323-A1B M323-A1I}} | <details> |
| | <summary>//=> GitHub Repo für externe Besucher//</summary> |
| | GitHub Repository https://github.com/templates-python/m323-lu01-a09-lager-funktional |
| | |
| | //Lernende am BZZ müssen den Link zum Classroom-Assignment verwenden// |
| | |
| | </details> |
| [[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi | [[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi |
| |