Meer expressieve functies · eindproject
Eindproject: Project: instelbare scoreberekening en rapporten
In dit hoofdstuk maakte je functies begrijpelijker en makkelijker aanpasbaar zonder klassen te introduceren. Je voegde nuttige standaardwaarden toe, benoemde belangrijke keuzes, gaf een ontbrekende waarde weer met None, documenteerde regels, scheidde berekening van afdrukken en gaf een functie mee als keuze.
Dit project brengt die ideeën terug naar het quizprogramma uit hoofdstuk 1. Die versie gebruikte één vaste vergelijkingsregel en één vast rapport. De aangepaste versie gebruikt nog steeds dictionaries, maar haar functies laten de omringende code meer van hun gedrag kiezen.
Het werk doorloopt een korte reeks:
selecteer een functie voor het vergelijken van antwoorden;
bereken de score en optionele bonus;
bouw een rapport vanuit de teruggegeven score.
Onderweg hergebruik je de ideeën uit het hoofdstuk:
een functiewaarde selecteert het gedrag voor antwoordvergelijking;
een standaardwaarde maakt exact vergelijken de gebruikelijke keuze;
een keyword-only bonus maakt een belangrijke aanpassing expliciet;
Noneonderscheidt een weggelaten rapportnotitie;typehints en docstrings leggen publieke beloften vast;
pure functies geven resultaten terug in plaats van af te drukken.
De meegeleverde vergelijkingsfuncties
Exact vergelijken behoudt elk teken:
def exact_match(response, expected):
return response == expected
Flexibel vergelijken schoont beide waarden op:
def flexible_match(response, expected):
return response.strip().lower() == expected.strip().lower()
score_attempts moet één van deze functies ontvangen en die voor elke poging aanroepen.
De gegevensafspraak
Elke pogingdictionary heeft drie sleutels:
{
"response": " DEF ",
"expected": "def",
"points": 2,
}
Tel de punten van die poging op wanneer de geselecteerde vergelijkingsfunctie True teruggeeft. Voeg de keyword-only bonus één keer toe nadat alle pogingen zijn gecontroleerd.
Een pure rapportbouwer
build_report moet twee regels teruggeven:
Practice: 6/6
Perfect score!
Kies wanneer note is weggelaten "Perfect score!" voor een volledige score en anders "Keep practicing.". Behoud een meegegeven notitie exact.
Zet de stappen van de scoreberekening in de juiste volgorde:
Sleep de opties in de juiste volgorde of gebruik de pijlknoppen.
Roep de vergelijkingsfunctie aan voor elk ingevoerd en verwacht antwoord.
Ontvang pogingen en een vergelijkingsfunctie.
Tel punten op voor overeenkomende antwoorden.
Voeg de eenmalige bonus toe.
Geef de score terug.
Geef de score door aan een afzonderlijke rapportfunctie.
Laat de functies werken met nieuwe gegevens
De afgeschermde controles gebruiken andere pogingen en kunnen een andere vergelijkingsfunctie meegeven. Schrijf elke functie op basis van de vastgelegde regels in plaats van de waarden in het zichtbare voorbeeld.
Houd deze oplossing gebaseerd op functies. Hoofdstuk 4 keert terug naar hetzelfde quizdomein nadat deze procedurele versie duidelijk werkt.
Opdracht
Maak score_attempts en build_report af.
score_attempts:
Behoud
matcher=exact_matchals standaardwaarde.Houd
bonuskeyword-only.Behoud de meegeleverde docstring.
Roep voor elke poging
matcher(response, expected)aan.Tel de punten van overeenkomende antwoorden op en voeg daarna één keer
bonustoe.Geef het getal terug zonder af te drukken.
build_report:
Behoud de meegeleverde typehints voor
score,total,labelen de teruggegeven waarde, plus de docstring.Kies alleen een notitie wanneer
note is None.Gebruik
"Perfect score!"voor een volledige score en anders"Keep practicing.".Geef
label: score/totalterug, gevolgd door een nieuwe regel en de notitie.
Het zichtbare voorbeeld moet na flexibel vergelijken en een bonus van één punt een perfecte score rapporteren.