0%

Meer expressieve functies · oefening

Geef een functie door als waarde

Tot nu toe ontvingen de parameters in dit hoofdstuk strings, getallen, dictionaries en None. Een parameter kan ook een functie ontvangen.

Begin met een gewone functie die de score uit één poging haalt:

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

Ronde haken toevoegen roept de functie aan en levert een score op:

score_of(attempt)

Zonder ronde haken verwijst score_of naar de functie in plaats van die uit te voeren:

score_of

Dankzij dat onderscheid kan één functie een andere functie ontvangen en bepalen wanneer die wordt aangeroepen.

Vertel sorted hoe records moeten worden vergeleken

Python kan eenvoudige getallen rechtstreeks sorteren. Een pogingdictionary bevat meerdere waarden, dus sorted moet weten welke waarde de volgorde bepaalt.

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


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


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

Het argument key ontvangt score_of, niet score_of(). Tijdens het sorteren roept sorted voor elke poging één keer score_of aan en gebruikt de teruggegeven scores voor de vergelijking.

Het sorteergedrag ligt niet meer vast in onze code. We geven de functie mee die de vergelijkingswaarde selecteert.

Geef de keuze door via een andere functie

We kunnen de keuze zelf een parameter maken. Deze algemene hulpfunctie zet willekeurige records in oplopende volgorde:

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

Nu kan dezelfde hulpfunctie records ordenen op een naam, datum of andere geselecteerde waarde. De code die order_records gebruikt, kiest het gedrag door een geschikte functie mee te geven. De oefening past dat ontwerp toe op een aflopende rangschikking van pogingen.

Welke expressie geeft de functie zelf door aan sorted?

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

Laat elke aanroep de rangschikregel kiezen

Maak rank_attempts af door key_function aan sorted door te geven. Leg geen dictionarysleutel vast in de code; de functie die bij elke aanroep wordt meegegeven, moet bepalen wat de rangschikking stuurt.

Opdracht

Maak rank_attempts af.

  • Geef een nieuwe lijst terug die door sorted is gemaakt.

  • Geef key_function door als key.

  • Sorteer in aflopende volgorde met reverse=True.

  • Roep key_function niet zelf aan en verander de oorspronkelijke lijst niet.

Het meegeleverde voorbeeld rangschikt op score. Afgeschermde controles geven een andere sleutelfunctie mee.