Lösen Sie ein und dieselbe Aufgabe dreimal – prozedural, objektorientiert und funktional – und vergleichen Sie die drei Lösungen systematisch.
Erweiterte Aufgabe – Bearbeitung nach LU04
Diese Aufgabe gehört inhaltlich zu LU01 (Paradigmen), wird aber erst nach LU04 bearbeitet. Erst dann stehen Ihnen mit map, filter, reduce und den Comprehensions die Bausteine zur Verfügung, die eine funktionale Lösung auch als solche erkennbar machen.
Sie zielt auf das Kompetenzniveau erweitert (AE1: Ich kann aufzeigen, wie Probleme in den verschiedenen Konzepten (OO, prozedural und funktional) gelöst werden und diese miteinander vergleichen.).
Für eine Klasse sollen aus einer Notenliste drei Kennzahlen ermittelt werden:
noten = [ ('Alina', 5.5), ('Ben', 3.5), ('Chiara', 4.0), ('Dario', 5.0), ('Elif', 3.9), ]
Durchschnitt: 4.38 Ungenuegend: ['Ben', 'Elif'] Beste Note: 5.5
Erstellen Sie drei separate Python-Dateien mit derselben Ausgabe:
append.Klasse (oder Notenliste) hält die Noten als Attribut.hinzufuegen(name, note), durchschnitt(), ungenuegende(), beste_note().hinzufuegen verändert.print innerhalb der berechnenden Funktionen.for-Schleife. Verwenden Sie die Bausteine aus LU04: map, filter, reduce, Lambda-Ausdrücke und Comprehensions.Warum das Schleifenverbot in Teil 3?
Ohne diese Vorgabe unterscheidet sich die funktionale Fassung kaum von der prozeduralen – beide hätten eine Schleife, nur an einer anderen Stelle. Erst wenn die Iteration ganz im Sprachkonstrukt verschwindet, wird sichtbar, was der deklarative Stil eigentlich ändert.
reduce importieren Sie mit from functools import reduce.
Füllen Sie anschliessend die folgende Tabelle aus und begründen Sie jede Zelle mit einem Satz:
| Kriterium | Prozedural | Objektorientiert | Funktional |
|---|---|---|---|
| Wo liegt der Zustand? | |||
| Was passiert, wenn dieselbe Berechnung zweimal aufgerufen wird? | |||
| Wie testet man die Berechnung einzeln? | |||
| Was muss man wissen, um eine einzelne Zeile zu verstehen? | |||
| Was geschieht, wenn zwei Programmteile gleichzeitig darauf zugreifen? | |||
| Anzahl Codezeilen |
durchschnitt() auf, fügen Sie dann eine Note hinzu und rufen Sie durchschnitt() erneut auf. Erklären Sie, warum derselbe Aufruf zwei verschiedene Ergebnisse liefert – und warum das in der funktionalen Fassung nicht passieren kann.