LU03.A04 - Datenfilterung

Erstellen Sie ein Programm, das eine Liste von Studentendaten und eine Filterfunktion akzeptiert. Die Filterfunktion sollte auf jedes Studentenobjekt angewendet werden, um zu bestimmen, ob es in die Ergebnisliste aufgenommen wird oder nicht.

Sie arbeiten an einer Schulverwaltung, und Sie müssen ein Modul entwickeln, das es ermöglicht, Studenten basierend auf verschiedenen Kriterien zu filtern. Das Modul sollte in der Lage sein, verschiedene Filterfunktionen zu akzeptieren, um die Daten auf verschiedene Arten zu filtern.

Daten verstehen

Sie erhalten ein Dictionary mit Studentendaten, machen Sie sich mit dieser Datenstruktur vertraut.

students = [
        {'name': 'Alice', 'age': 15, 'class': '10A'},
        {'name': 'Bob', 'age': 16, 'class': '10B'},
        {'name': 'Charlie', 'age': 14, 'class': '9A'}
    ]

Filterfunktion Erstellen

Schreiben Sie eine Funktion, die eine Liste von Studenten und eine Filterfunktion akzeptiert.

#Pseudocode
filter_die_studenten(studenten, funktion_um_zu_filtern, *argumente)
    GEBE_ZURÜCK funktion_um_zu_filtern(studenten, *argumente)

Einige Filterfunktionen Definieren

Schreiben Sie einige verschiedene Filterfunktionen (z.B. nach Alter filtern, nach Klasse filtern).

#Pseudocode
filter_nach_alter(studenten, minumum_alter)
    # Erstelle eine neue Liste, kopiere alle Studenten wo alter > minumum_alter. Gebe diese Liste zurück.

Testen Sie Ihre Lösung

Verwenden Sie den if __name__ == '__main__': Block, um Ihre Funktionen zu testen.

#Pseudocode
 
 
nach_alter_gefiltert = filter_die_studenten(students, filter_nach_alter, 15)
DRUCKE('Gefiltert nach alter:', nach_alter_gefiltert)
...

Vorlage

def filter_by_age(students, age):
    """
    Filtert die Studentenliste nach einem gegebenen Mindestalter.
 
    :param students: Liste von Studentendaten
    :param age: Mindestalter für den Filter
    :return: Gefilterte Liste von Studenten
    """
    pass
 
 
def filter_by_class(students, class_name):
    """
    Filtert die Studentenliste nach einer gegebenen Klasse.
 
    :param students: Liste von Studentendaten
    :param class_name: Klassenname für den Filter
    :return: Gefilterte Liste von Studenten
    """
    pass
 
 
def filter_students(students, filter_function, *args):
    """
    Filtert die Studentenliste mit einer gegebenen Filterfunktion.
 
    :param students: Liste von Studentendaten
    :param filter_function: Funktion, die zum Filtern der Studenten verwendet wird
    :param args: Zusätzliche Argumente für die Filterfunktion
    :return: Gefilterte Liste von Studenten
    """
    # your code here
    pass
 
 
if __name__ == '__main__':
    students = [
        {'name': 'Alice', 'age': 15, 'class': '10A'},
        {'name': 'Bob', 'age': 16, 'class': '10B'},
        {'name': 'Charlie', 'age': 14, 'class': '9A'}
    ]
    # your code here

Hinweis

Das *args in einer Funktionsdefinition in Python wird verwendet, um eine variable Anzahl von nicht-schlüsselwortbasierten Argumenten zu übergeben. Es ermöglicht es Ihnen, mehr (oder weniger) Argumente zu übergeben, als in der ursprünglichen Definition der Funktion angegeben wurden.

Im Kontext Ihres Beispiels könnte *args in der filter_die_studenten-Funktion verwendet werden, um zusätzliche Argumente an die funktion_um_zu_filtern zu übergeben, ohne dass Sie die Signatur von filter_die_studenten jedes Mal ändern müssen, wenn Sie eine neue Filterfunktion mit unterschiedlichen Argumenten hinzufügen.

Wieso diesen Aufwand

Die Funktion filter_die_studenten dient als eine allgemeinere und abstraktere Schnittstelle, die es ermöglicht, unterschiedliche Filterfunktionen auf die Liste der Studenten anzuwenden. Es mag auf den ersten Blick überflüssig erscheinen, aber es hat einige Vorteile:

Wiederverwendbarkeit: Durch die Verwendung der filter_die_studenten Funktion kannst du jede Art von Filterfunktion anwenden, die die gleiche Signatur hat. Das bedeutet, dass du in Zukunft einfach neue Filterfunktionen hinzufügen kannst, ohne den Hauptteil deines Codes ändern zu müssen. Die filter_die_studenten Funktion kann mit jeder Filterfunktion verwendet werden, die die Studentenliste und eventuelle zusätzliche Argumente akzeptiert.

Abstraktion: Die filter_die_studenten Funktion abstrahiert das Aufrufen der spezifischen Filterfunktion. Der Code, der die filter_die_studenten Funktion aufruft, muss nicht wissen, welche spezifische Filterfunktion aufgerufen wird. Das macht den Code sauberer und leichter verständlich.

Erweiterbarkeit: Wenn du in Zukunft entscheidest, dass du vor oder nach der Filterung etwas anderes mit der Studentenliste machen möchtest (zum Beispiel, sie zu sortieren, zu loggen, etc.), musst du diese Änderung nur in der filter_die_studenten Funktion machen, anstatt an jedem Ort im Code, an dem eine Filterfunktion aufgerufen wird.

In einfachen Fällen mag die Verwendung einer solchen Funktion überflüssig erscheinen, aber in größeren und komplexeren Systemen kann diese Art von Abstraktion sehr hilfreich sein, um sauberen, wiederverwendbaren und wartbaren Code zu schreiben.

Strategy-Pattern

Das Muster, das hier verwendet wird, ist ein Beispiel für das Strategie-Muster (Strategy Pattern). Es ist ein Verhaltensmuster, das ein Familienalgorithmus definiert und sie in separate Klassen kapselt, um sie austauschbar zu machen. Das Strategie-Muster ermöglicht den Algorithmus unabhängig von den Clients, die diesen Algorithmus verwenden, zu variieren.

Im gegebenen Beispiel:

Die Funktion filter_die_studenten nimmt eine Filterfunktion als Argument. Diese Filterfunktion ist die “Strategie”, die ausgetauscht werden kann. Die verschiedenen Filterfunktionen wie filter_by_age oder filter_by_class sind die konkreten Strategien, die mit der filter_die_studenten Funktion ausgetauscht werden können. Durch das Verwenden des Strategie-Musters kannst du den Code flexibler und einfacher zu erweitern machen, ohne die Hauptlogik zu ändern. Jede neue Filterfunktion, die du hinzufügen möchtest, kann einfach als neue Strategie implementiert werden, ohne dass der Code, der die Filterung aufruft, geändert werden muss.


© Kevin Maurizi

  • modul/m323/learningunits/lu03/aufgaben/filter.txt
  • Last modified: 2023/11/13 08:56
  • by 127.0.0.1