Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
modul:m323:learningunits:lu02:aufgaben:dataclass1 [2024/08/28 09:24] – kmaurizi | modul:m323:learningunits:lu02:aufgaben:dataclass1 [2024/08/28 11:39] (aktuell) – kmaurizi |
---|
====== LU02.A10 - Immutable Dataclasses ====== | ====== LU02.A10 - Immutable Dataclass ====== |
| |
<WRAP center round todo 60%> | <WRAP center round todo 60%> |
Erstellen Sie mehrere pure functions, die zusammenarbeiten, um eine komplexe Datenstruktur auf Basis von immutable Dataclasses zu manipulieren. | Implementieren Sie eine Funktion, die eine neue Instanz einer Dataclass erstellt, anstatt die Originalinstanz zu verändern, und nutzen Sie dabei die Prinzipien der funktionalen Programmierung. |
</WRAP> | </WRAP> |
| |
==== Aufgabenstellung ==== | ==== Aufgabenstellung ==== |
| |
- Definieren Sie eine `@dataclass(frozen=True)` namens ''Student'' mit den Attributen ''name'' (str), ''grades'' (List[int]), und ''graduated'' (bool). | Im Rahmen der funktionalen Programmierung ist es von entscheidender Bedeutung, Datenstrukturen unveränderlich (immutable) zu gestalten. Indem wir immutable Dataclasses verwenden, vermeiden wir unbeabsichtigte Seiteneffekte und sorgen dafür, dass unsere Datenstrukturen nur durch explizite, kontrollierte Operationen verändert werden. In dieser Aufgabe werden Sie lernen, wie man eine Dataclass verwendet, um eine unveränderliche (immutable) Datenstruktur zu erstellen, und wie man diese im Kontext der funktionalen Programmierung manipuliert. |
- Implementieren Sie eine Funktion ''add_grade(student: Student, grade: int) -> Student'', die eine neue Instanz der Dataclass ''Student'' zurückgibt, wobei die neue Note der Liste hinzugefügt wird. | |
- Implementieren Sie eine Funktion ''calculate_average(student: Student) -> float'', die den Durchschnitt der Noten berechnet. | |
- Implementieren Sie eine Funktion ''graduate_student(student: Student) -> Student'', die eine neue Instanz der Dataclass zurückgibt, bei der das Attribut ''graduated'' auf ''True'' gesetzt wird, wenn der Notendurchschnitt 70 oder mehr beträgt. | |
- Schreiben Sie ein Programm, das mehrere Noten hinzufügt, den Durchschnitt berechnet und den Studenten "absolviert", falls die Kriterien erfüllt sind. Geben Sie die Ergebnisse aus. | |
| |
==== Code Vorlage ==== | - Definieren Sie eine ''@dataclass(frozen=True)'' namens ''Car'' mit den Attributen ''brand (str)'', ''mileage (int)'' und ''service_dates (List[str])''. |
| - Implementieren Sie eine Funktion ''add_mileage(car: Car, distance: int) -> Car'', die eine neue Instanz der Dataclass ''Car'' erstellt, mit einer aktualisierten ''mileage'' und einer neuen Service-Datum, wenn die Laufleistung über 10.000 km steigt. |
| - Die neue Instanz soll das aktualisierte Datum in der Liste ''service_dates'' speichern. Das Datum kann dabei ein fester Wert wie ''2024-08-28'' sein (für Testzwecke). |
| - Implementieren Sie eine zweite Funktion ''check_service(car: Car) -> bool'', die prüft, ob die Laufleistung über 10.000 km liegt und entsprechend ''True'' oder ''False'' zurückgibt. |
| - Nutzen Sie die Funktionen, um mehrere Änderungen an einer Instanz von ''Car'' durchzuführen, und drucken Sie die Liste der Service-Daten am Ende aus. |
| |
<code python> | |
from dataclasses import dataclass, field | |
from typing import List | |
| |
@dataclass(frozen=True) | ==== Schritt für Schritt ==== |
class Student: | |
name: str | |
grades: List[int] = field(default_factory=list) | |
graduated: bool = False | |
| |
def add_grade(student: Student, grade: int) -> Student: | - Definieren Sie die immutable Dataclass ''Car'' in einer separaten Datei ''car.py''. |
""" | - Implementieren Sie die Funktion ''add_mileage'', die eine neue Instanz zurückgibt, wenn die Laufleistung aktualisiert wird, und fügt gegebenenfalls ein Service-Datum hinzu. |
Returns a new Student instance with the added grade. | - Implementieren Sie die Funktion ''check_service'', die die Laufleistung überprüft. |
""" | - Führen Sie mehrere Funktionsaufrufe durch, um die Änderungen zu testen und die Liste der Service-Daten zu überprüfen. |
new_grades = student.grades + [grade] | |
return Student(name=student.name, grades=new_grades, graduated=student.graduated) | |
| |
def calculate_average(student: Student) -> float: | |
""" | |
Returns the average of the student's grades. | |
""" | |
if not student.grades: | |
return 0.0 | |
return sum(student.grades) / len(student.grades) | |
| |
def graduate_student(student: Student) -> Student: | |
""" | |
Graduates the student if the average grade is 70 or above. | |
""" | |
average = calculate_average(student) | |
if average >= 70: | |
return Student(name=student.name, grades=student.grades, graduated=True) | |
return student | |
| |
if __name__ == '__main__': | |
student = Student(name='John Doe') | |
student = add_grade(student, 85) | |
student = add_grade(student, 75) | |
student = add_grade(student, 60) | |
| |
print(f'Noten: {student.grades}') | |
average = calculate_average(student) | |
print(f'Durchschnitt: {average}') | |
| |
student = graduate_student(student) | |
print(f'Absolviert: {student.graduated}') | |
</code> | |
| |
==== Schritt für Schritt ==== | |
| |
- Definieren Sie die immutable Dataclass ''Student''. | ---- |
- Implementieren Sie die Funktion ''add_grade'', die eine neue Instanz zurückgibt und die Note hinzufügt. | <nodisp>https://github.com/templates-python/m323-lu02-a10-dataclass1</nodisp> |
- Implementieren Sie die Funktion ''calculate_average'', die den Notendurchschnitt berechnet. | [[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 |
- Implementieren Sie die Funktion ''graduate_student'', die eine neue Instanz zurückgibt, wenn der Student die Anforderungen erfüllt. | |
- Führen Sie mehrere Funktionsaufrufe durch, um die Noten zu aktualisieren, den Durchschnitt zu berechnen und den Studenten bei Erfüllung der Kriterien zu absolvieren. | |