Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| modul:m323:learningunits:lu01:loesungen:paradigmenvergleich [2026/08/18 10:12] – Neue Loesung LU01.L13 - Dasselbe Problem in drei Paradigmen admin | modul:m323:learningunits:lu01:loesungen:paradigmenvergleich [2026/08/18 11:36] (aktuell) – Funktionale Fassung auf map/filter/reduce umgestellt (Bearbeitung nach LU04) admin | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== LU01.L13 - Dasselbe Problem in drei Paradigmen ====== | ====== LU01.L13 - Dasselbe Problem in drei Paradigmen ====== | ||
| + | |||
| + | <WRAP center round info 80%> | ||
| + | Diese Aufgabe gehört inhaltlich zu LU01, wird aber erst **nach LU04** bearbeitet – die funktionale Fassung setzt '' | ||
| + | </ | ||
| ===== 1. prozedural.py ===== | ===== 1. prozedural.py ===== | ||
| <code python> | <code python> | ||
| - | noten = [("Alina", 5.5), ("Ben", 3.5), ("Chiara", 4.0), ("Dario", 5.0), ("Elif", 3.9)] | + | noten = [('Alina', 5.5), ('Ben', 3.5), ('Chiara', 4.0), ('Dario', 5.0), ('Elif', 3.9)] |
| if __name__ == ' | if __name__ == ' | ||
| Zeile 20: | Zeile 24: | ||
| durchschnitt = summe / len(noten) | durchschnitt = summe / len(noten) | ||
| - | print(f"Durchschnitt: | + | print(f'Durchschnitt: |
| - | print(f"Ungenuegend: | + | print(f'Ungenuegend: |
| - | print(f"Beste Note: {beste}") | + | print(f'Beste Note: {beste}') |
| </ | </ | ||
| Zeile 48: | Zeile 52: | ||
| if __name__ == ' | if __name__ == ' | ||
| - | klasse = Klasse([("Alina", 5.5), ("Ben", 3.5), ("Chiara", 4.0), | + | klasse = Klasse([('Alina', 5.5), ('Ben', 3.5), ('Chiara', 4.0), |
| - | ("Dario", 5.0), ("Elif", 3.9)]) | + | ('Dario', 5.0), ('Elif', 3.9)]) |
| - | print(f"Durchschnitt: | + | print(f'Durchschnitt: |
| - | print(f"Ungenuegend: | + | print(f'Ungenuegend: |
| - | print(f"Beste Note: {klasse.beste_note()}") | + | print(f'Beste Note: {klasse.beste_note()}') |
| </ | </ | ||
| Zeile 59: | Zeile 63: | ||
| <code python> | <code python> | ||
| + | from functools import reduce | ||
| + | |||
| + | |||
| + | def noten_werte(noten): | ||
| + | """ | ||
| + | return map(lambda paar: paar[1], noten) | ||
| + | |||
| + | |||
| def durchschnitt(noten): | def durchschnitt(noten): | ||
| - | return | + | return |
| def ungenuegende(noten): | def ungenuegende(noten): | ||
| - | return [name for name, note in noten if note < 4.0] | + | return |
| + | filter(lambda paar: paar[1] | ||
| def beste_note(noten): | def beste_note(noten): | ||
| - | return | + | return |
| Zeile 76: | Zeile 89: | ||
| if __name__ == ' | if __name__ == ' | ||
| - | noten = [("Alina", 5.5), ("Ben", 3.5), ("Chiara", 4.0), | + | noten = [('Alina', 5.5), ('Ben', 3.5), ('Chiara', 4.0), |
| - | ("Dario", 5.0), ("Elif", 3.9)] | + | ('Dario', 5.0), ('Elif', 3.9)] |
| - | print(f"Durchschnitt: | + | print(f'Durchschnitt: |
| - | print(f"Ungenuegend: | + | print(f'Ungenuegend: |
| - | print(f"Beste Note: {beste_note(noten)}") | + | print(f'Beste Note: {beste_note(noten)}') |
| </ | </ | ||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | **Kürzer geht es mit den eingebauten Funktionen** | ||
| + | |||
| + | '' | ||
| + | |||
| + | <code python> | ||
| + | def durchschnitt(noten): | ||
| + | return sum(note for _, note in noten) / len(noten) | ||
| + | |||
| + | def beste_note(noten): | ||
| + | return max(note for _, note in noten) | ||
| + | </ | ||
| + | |||
| + | Beide Fassungen sind funktional. Verlangt ist in der Aufgabe die explizite mit '' | ||
| + | </ | ||
| ===== Vergleichstabelle ===== | ===== Vergleichstabelle ===== | ||
| Zeile 92: | Zeile 121: | ||
| | Was muss man wissen, um eine Zeile zu verstehen? | Den bisherigen Verlauf der Schleife: Welche Werte haben '' | | Was muss man wissen, um eine Zeile zu verstehen? | Den bisherigen Verlauf der Schleife: Welche Werte haben '' | ||
| | Gleichzeitiger Zugriff? | Problematisch: | | Gleichzeitiger Zugriff? | Problematisch: | ||
| - | | Anzahl Codezeilen | am wenigsten | + | | Anzahl Codezeilen | mittel |
| <WRAP center round info 80%> | <WRAP center round info 80%> | ||
| **Zur Zeilenzahl** | **Zur Zeilenzahl** | ||
| - | Die Zeilenzahl ist das schwächste der sechs Kriterien. Die prozedurale Fassung ist am kürzesten und trotzdem am schlechtesten wartbar – Kürze und Qualität sind nicht dasselbe. Bewerten Sie in Ihrer Abgabe vor allem die ersten fünf Zeilen der Tabelle. | + | Die Zeilenzahl ist das schwächste der sechs Kriterien. Bewerten Sie in Ihrer Abgabe vor allem die ersten fünf Zeilen der Tabelle |
| </ | </ | ||
| Zeile 115: | Zeile 144: | ||
| klasse = Klasse(noten) | klasse = Klasse(noten) | ||
| print(round(klasse.durchschnitt(), | print(round(klasse.durchschnitt(), | ||
| - | klasse.hinzufuegen("Fabio", 2.0) | + | klasse.hinzufuegen('Fabio', 2.0) |
| print(round(klasse.durchschnitt(), | print(round(klasse.durchschnitt(), | ||
| </ | </ | ||
| Zeile 125: | Zeile 154: | ||
| <code python> | <code python> | ||
| print(durchschnitt(noten)) | print(durchschnitt(noten)) | ||
| - | erweitert = note_hinzufuegen(noten, | + | erweitert = note_hinzufuegen(noten, |
| print(durchschnitt(noten)) | print(durchschnitt(noten)) | ||
| print(durchschnitt(erweitert)) | print(durchschnitt(erweitert)) | ||
| Zeile 142: | Zeile 171: | ||
| Objektorientierung ist also **kein Gegensatz** zur imperativen Programmierung, | Objektorientierung ist also **kein Gegensatz** zur imperativen Programmierung, | ||
| - | ==== 4. Wann welches Paradigma? ==== | + | ==== 4. Leere Notenliste ==== |
| + | |||
| + | < | ||
| + | TypeError: reduce() of empty iterable with no initial value | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | |||
| + | <code python> | ||
| + | # Variante A: Startwert angeben | ||
| + | def summe(noten): | ||
| + | return reduce(lambda a, b: a + b, noten_werte(noten), | ||
| + | |||
| + | # Variante B: den Randfall zur Bedingung der Funktion machen | ||
| + | def durchschnitt(noten): | ||
| + | if not noten: | ||
| + | raise ValueError(' | ||
| + | return reduce(lambda a, b: a + b, noten_werte(noten)) / len(noten) | ||
| + | </ | ||
| + | |||
| + | Bei der Summe ist '' | ||
| + | |||
| + | ==== 5. Wann welches Paradigma? ==== | ||
| Mögliche Antworten – die Beispiele der Lernenden dürfen abweichen, müssen aber begründet sein: | Mögliche Antworten – die Beispiele der Lernenden dürfen abweichen, müssen aber begründet sein: | ||