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
sortedis gemaakt.Geef
key_functiondoor alskey.Sorteer in aflopende volgorde met
reverse=True.Roep
key_functionniet zelf aan en verander de oorspronkelijke lijst niet.
Het meegeleverde voorbeeld rangschikt op score. Afgeschermde controles geven een andere sleutelfunctie mee.