Zelf functies schrijven · eindproject
Eindproject: Project: bouw het interactieve menu opnieuw op met functies
In hoofdstuk 7 bouwde je een interactief menu als één lange lus. Het was een geslaagd programma, en het groeiende lusblok maakte het volgende ontwerpprobleem zichtbaar.
Nu bouw je hetzelfde gedrag opnieuw op met functies.
Dit heet refactoren: de structuur van werkende code veranderen terwijl je behoudt wat die code doet.
Vergelijk de twee vormen
Het oorspronkelijke menu plaatste elk detail binnen zijn takken:
if command == "add":
new_item = input("What should I add? ").strip()
items.append(new_item)
print(f"Added: {new_item}")
elif command == "list":
if len(items) == 0:
print("The list is empty.")
else:
number = 1
for item in items:
print(f"{number}. {item}")
number += 1
elif command == "count":
print(f"Items stored: {len(items)}")
De herstructuurde lus draagt die acties over aan functies:
if command == "add":
add_item(items)
elif command == "list":
show_items(items)
elif command == "count":
show_count(items)
Het totale programma is niet per se korter. Je vindt er makkelijker je weg in:
run_menulegt het volledige gesprek uit.add_itemlegt het toevoegen uit.show_itemslegt het tonen van de lijst uit.show_countlegt het tellen uit.
Elke functie kan afzonderlijk worden gelezen en gecontroleerd.
De vier functies
add_item(items)
Stel precies deze vraag:
What should I add?
Schoon het antwoord op met .strip(), voeg het toe aan items en druk dit af:
Added: read a book
De lijst die aan de functie wordt doorgegeven, is dezelfde lijst die het menu gebruikt. Toevoegen wijzigt die lijst, zodat latere opdrachten het nieuwe item zien.
show_items(items)
Druk dit af als de lijst leeg is:
The list is empty.
Druk anders elk item af op een genummerde regel, beginnend bij 1.
show_count(items)
Druk dit af:
Items stored: 2
Gebruik daarbij de werkelijke lengte van de lijst.
run_menu(items)
Deze functie beheert de lus. Ze stelt precies deze vraag:
Command (add, list, count, quit):
Schoon de opdracht op met .strip().lower().
Roep voor add, list en count de bijbehorende functie aan. Druk voor quit de tekst Goodbye. af en verlaat de lus. Druk voor elke andere invoer I do not know that command. af en ga verder.
Het programma op het hoogste niveau
Na de definities:
kies een niet-lege
menu_title;maak een lege lijst met de naam
items;druk de titel af;
roep
run_menu(items)aan;druk
Final count:af, gevolgd door de uiteindelijke lengte.
Die vijf regels beschrijven de levensloop van het programma zonder elke menuactie uit te leggen.
Bouw en test in delen
Schrijf niet het hele project voordat je het uitvoert.
Schrijf
show_counten roep die functie tijdelijk aan met een lijst van twee waarden.Schrijf
show_itemsen test zowel een lege lijst als een lijst met twee waarden.Schrijf
add_item, roep de functie één keer aan en bekijk daarna de lijst.Schrijf
run_menumet alleen de tak voorquit.Voeg steeds één opdrachttak toe. Elke tak moet het werk aan de bijbehorende functie overdragen.
Verwijder tijdelijke aanroepen en voer daarna het complete programma op het hoogste niveau uit.
Doorloop deze reeks:
listterwijl de lijst leeg is;addom een eerste item toe te voegen;ADDin hoofdletters en voeg een tweede item toe met spaties eromheen;count;een onbekende opdracht;
list;quit.
Het gedrag moet overeenkomen met je project uit hoofdstuk 7. Het verschil zit in wat de code duidelijk maakt.
Lees het resultaat op twee niveaus
Lees eerst alleen de regels op het hoogste niveau en run_menu. Kun je het plan van het hele programma begrijpen?
Open daarna show_items. Kun je het tonen van de lijst begrijpen zonder de invoerlogica en de toevoeglogica te lezen?
Die scheiding is het resultaat van dit hoofdstuk. Functies zijn meer dan een manier om het kopiëren van code te vermijden. Je kunt ermee ontwerpen waar elk stukje kennis thuishoort.
Als Guided bij je abonnement hoort, kun je Monty vragen:
Lees mijn functienamen en vertel of elke functie één duidelijke verantwoordelijkheid heeft. Wijs één grens aan die ik opnieuw zou moeten bekijken, maar herschrijf het project niet.
Je weet nu hoe je van een werkende reeks instructies bewerkingen met een naam maakt die je kunt testen. Hoofdstuk 9 geeft die functies rijkere informatie om mee te werken door dictionaries te introduceren en soorten verzamelingen te vergelijken.
Opdracht
Bouw het interactieve menu uit hoofdstuk 7 opnieuw op met vier functies.
Eisen:
Definieer
add_item(items). De functie vraagtWhat should I add?, verwijdert de spaties aan de buitenkant van het antwoord, voegt het toe en druktAdded:af, gevolgd door het item.Definieer
show_items(items). De functie druktThe list is empty.af voor een lege lijst, of elk item op een genummerde regel, beginnend bij1.Definieer
show_count(items). De functie druktItems stored:af, gevolgd door de lengte.Definieer
run_menu(items). De functie vraagt herhaaldelijkCommand (add, list, count, quit):en schoont het antwoord op met.strip().lower().Binnen
run_menumoeten de takken vooradd,listencountde bijbehorende functies aanroepen.quitdruktGoodbye.af en beëindigt de lus.Een onbekende opdracht drukt
I do not know that command.af en de lus gaat verder.Geef na alle functiedefinities
menu_titleeen niet-lege string naar keuze en maak een lege lijst met de naamitems.Druk de titel af, roep
run_menu(items)aan en druk daarnaFinal count:af, gevolgd door de uiteindelijke lengte.
Kies zelf een titel en items. Neem elke voorgeschreven vraag en elk bericht exact over, zodat het gedrag gecontroleerd kan worden.