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
sortederzeugt wurde.Übergib
key_functionalskey.Sortiere mit
reverse=Trueabsteigend.Rufe
key_functionnicht selbst auf und verändere die ursprüngliche Liste nicht.
Das vorgegebene Beispiel ordnet nach Punktzahl. Verdeckte Prüfungen übergeben eine andere Schlüsselfunktion.