0%

Ausdrucksstärkere Funktionen · Übung

Übergib eine Funktion als Wert

Bisher haben die Parameter in diesem Kapitel Strings, Zahlen, Dictionarys und None erhalten. Ein Parameter kann auch eine Funktion erhalten.

Beginne mit einer gewöhnlichen Funktion, die die Punktzahl eines Versuchs ausliest:

def score_of(attempt):
    return attempt["score"]

Das Hinzufügen von Klammern ruft die Funktion auf und liefert eine Punktzahl:

score_of(attempt)

Ohne Klammern verweist score_of auf die Funktion, statt sie auszuführen:

score_of

Dieser Unterschied erlaubt einer Funktion, eine andere Funktion zu erhalten und zu entscheiden, wann sie sie aufruft.

Sage sorted, wie es Datensätze vergleichen soll

Python kann einfache Zahlen direkt sortieren. Ein Dictionary für einen Versuch enthält mehrere Werte. Deshalb muss sorted wissen, welcher davon die Reihenfolge bestimmen soll.

attempts = [
    {"learner": "Mina", "score": 8},
    {"learner": "Noah", "score": 6},
]


def score_of(attempt):
    return attempt["score"]


ranked = sorted(attempts, key=score_of, reverse=True)

Das Argument key erhält score_of, nicht score_of(). Beim Sortieren ruft sorted für jeden Versuch einmal score_of auf und verwendet die zurückgegebenen Punktzahlen für den Vergleich.

Das Sortierverhalten ist nicht mehr in unserem Code festgelegt. Wir übergeben die Funktion, die den Vergleichswert auswählt.

Reiche die Auswahl durch eine andere Funktion weiter

Wir können die Auswahl selbst zu einem Parameter machen. Diese allgemeine Hilfsfunktion ordnet beliebige Datensätze aufsteigend:

def order_records(records, key_function):
    return sorted(records, key=key_function)

Jetzt kann dieselbe Hilfsfunktion Datensätze nach einem Namen, einem Datum oder einem anderen ausgewählten Wert ordnen. Der Code, der order_records verwendet, wählt das Verhalten durch die Übergabe einer passenden Funktion. Die Übung wendet diesen Entwurf auf eine absteigende Rangfolge von Versuchen an.

Welcher Ausdruck übergibt die Funktion selbst an sorted?

def score_of(attempt):
    return attempt["score"]

Lass jeden Aufruf die Sortierregel wählen

Vervollständige rank_attempts, indem du key_function an sorted weiterreichst. Schreibe keinen Dictionary-Schlüssel fest in den Code. Die mit jedem Aufruf übergebene Funktion soll entscheiden, was die Rangfolge bestimmt.

Aufgabe

Vervollständige rank_attempts.

  • Gib eine neue Liste zurück, die von sorted erzeugt wurde.

  • Übergib key_function als key.

  • Sortiere mit reverse=True absteigend.

  • Rufe key_function nicht selbst auf und verändere die ursprüngliche Liste nicht.

Das vorgegebene Beispiel ordnet nach Punktzahl. Verdeckte Prüfungen übergeben eine andere Schlüsselfunktion.