====== LU01.A09 - Vom Skript zur Funktion ====== Bauen Sie ein Lagerverwaltungs-Skript, das ausschliesslich aus Prozeduren mit globalem Zustand besteht, in echte Funktionen um – so, dass jeder Aufruf bei gleicher Eingabe immer dasselbe Ergebnis liefert. ===== Ausgangslage ===== 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. ~~NOCACHE~~ === ausgangslage.py === {{gh>https://github.com/templates-python/m323-lu01-a09-lager-funktional/blob/main/ausgangslage.py}} ===== Code-Vorlage ===== Die Namen und Signaturen in ''main.py'' sind fix – die Tests rufen genau diese auf. === main.py === {{gh>https://github.com/templates-python/m323-lu01-a09-lager-funktional/blob/main/main.py}} ===== Anforderungen ===== - **Analyse:** Halten Sie fest, welche der drei ''def''-Blöcke in ''ausgangslage.py'' Prozeduren sind und woran Sie das erkennen. - **Umbau:** Implementieren Sie in ''main.py'' die vier vorgegebenen Funktionen so, dass gilt: * Keine globalen Variablen – alle benötigten Daten kommen als Parameter herein. * Kein ''print'' innerhalb der berechnenden Funktionen. Ausgegeben wird ausschliesslich in ''main()''. * Jede Funktion gibt einen Wert zurück. * ''artikel_hinzufuegen'' verändert die übergebene Liste **nicht**, sondern gibt eine **neue** Liste zurück. ^ 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 ==== Gesamtwert: 1065.00 CHF Teuerster Artikel: Monitor ===== 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? - Was gibt ''zeige_gesamtwert()'' zurück? Probieren Sie ''ergebnis = zeige_gesamtwert()'' und geben Sie ''ergebnis'' aus. - Welche Ihrer neuen Funktionen liessen sich mit einem automatischen Test prüfen, welche der alten Prozeduren nicht? Begründen Sie. **Hinweis** 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? **Achtung beim Linting** ''global'' kostet in dieser Aufgabe Punkte (''W0603 global-statement'' ist bewusst aktiviert) – genau darum geht es ja. ===== 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 ===== 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. ----
//=> GitHub Repo für externe Besucher// GitHub Repository https://github.com/templates-python/m323-lu01-a09-lager-funktional //Lernende am BZZ müssen den Link zum Classroom-Assignment verwenden//
[[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