0%

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:

  1. selecteer een functie voor het vergelijken van antwoorden;

  2. bereken de score en optionele bonus;

  3. 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;

  • None onderscheidt 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_match als standaardwaarde.

  • Houd bonus keyword-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 bonus toe.

  • Geef het getal terug zonder af te drukken.

build_report:

  • Behoud de meegeleverde typehints voor score, total, label en 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/total terug, 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.