====== 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