Eigene Funktionen schreiben · Abschlussprojekt
Abschlussprojekt: Projekt: Das interaktive Menü mit Funktionen neu aufbauen
In Kapitel 7 hast du ein interaktives Menü als eine lange Schleife gebaut. Es war ein funktionierendes Programm, und sein wachsender Schleifenkörper machte das nächste Entwurfsproblem sichtbar.
Jetzt baust du dasselbe Verhalten mit Funktionen neu auf.
Das ist Refactoring: die Struktur von funktionierendem Code verändern und dabei sein Verhalten beibehalten.
Vergleiche die beiden Formen
Im ursprünglichen Menü stand jedes Detail innerhalb seiner Zweige:
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)}")
Die umstrukturierte Schleife übergibt diese Aktionen an Funktionen:
if command == "add":
add_item(items)
elif command == "list":
show_items(items)
elif command == "count":
show_count(items)
Das gesamte Programm ist nicht unbedingt kürzer. Es ist leichter, sich darin zurechtzufinden:
run_menuerklärt den gesamten Dialog.add_itemerklärt das Hinzufügen.show_itemserklärt das Auflisten.show_counterklärt das Zählen.
Jede Funktion lässt sich einzeln lesen und prüfen.
Die vier Funktionen
add_item(items)
Frage genau Folgendes ab:
What should I add?
Bereinige die Antwort mit .strip(), hänge sie an items an und gib Folgendes aus:
Added: read a book
Die an die Funktion übergebene Liste ist dieselbe Liste, die das Menü verwendet. Das Anhängen verändert diese Liste, deshalb sehen spätere Befehle den neuen Eintrag.
show_items(items)
Wenn die Liste leer ist, gib Folgendes aus:
The list is empty.
Gib andernfalls jeden Eintrag in einer nummerierten Zeile aus, beginnend bei 1.
show_count(items)
Gib Folgendes aus:
Items stored: 2
Verwende dabei die tatsächliche Länge der Liste.
run_menu(items)
Diese Funktion ist für die Schleife zuständig. Sie fragt genau Folgendes ab:
Command (add, list, count, quit):
Bereinige den Befehl mit .strip().lower().
Rufe für add, list und count die passende Funktion auf. Gib bei quit den Text Goodbye. aus und verlasse die Schleife. Gib bei allem anderen I do not know that command. aus und mache weiter.
Das Programm auf der obersten Ebene
Nach den Definitionen:
wähle einen nicht leeren
menu_title;erstelle eine leere Liste namens
items;gib den Titel aus;
rufe
run_menu(items)auf;gib
Final count:gefolgt von der endgültigen Länge aus.
Diese fünf Zeilen beschreiben den Ablauf des Programms, ohne jede Menüaktion zu erklären.
In Teilen bauen und testen
Schreibe nicht das gesamte Projekt, bevor du es ausführst.
Schreibe
show_countund rufe die Funktion dann vorübergehend mit einer Liste aus zwei Werten auf.Schreibe
show_itemsund teste sowohl eine leere Liste als auch eine Liste mit zwei Werten.Schreibe
add_item, rufe die Funktion einmal auf und untersuche danach die Liste.Schreibe
run_menuzunächst nur mit demquit-Zweig.Füge einen Befehlszweig nach dem anderen hinzu. Jeder Zweig soll die Arbeit an seine Funktion übergeben.
Entferne die vorübergehenden Aufrufe und führe dann das vollständige Programm auf der obersten Ebene aus.
Arbeite diese Reihenfolge durch:
listbei leerer Liste;mit
addeinen ersten Eintrag hinzufügen;ADDin Großbuchstaben eingeben und einen zweiten Eintrag mit umgebenden Leerzeichen hinzufügen;count;einen unbekannten Befehl;
list;quit.
Das Verhalten soll deinem Projekt aus Kapitel 7 entsprechen. Der Unterschied liegt darin, was der Code vermittelt.
Lies das Ergebnis auf zwei Ebenen
Lies zuerst nur die Zeilen auf der obersten Programmebene und run_menu. Kannst du den Plan des gesamten Programms verstehen?
Öffne dann show_items. Kannst du das Auflisten verstehen, ohne die Logik für Eingaben und das Hinzufügen zu lesen?
Diese Trennung ist das Ergebnis dieses Kapitels. Mit Funktionen kannst du nicht nur vermeiden, Code zu kopieren. Du kannst damit festlegen, an welche Stelle welches Wissen gehört.
Wenn dein Tarif Guided enthält, kannst du Monty fragen:
Lies meine Funktionsnamen und sage mir, ob jede Funktion eine klare Aufgabe hat. Zeige mir eine Grenze, die ich überdenken sollte, aber schreibe das Projekt nicht um.
Du weißt jetzt, wie du eine funktionierende Folge von Anweisungen in benannte, prüfbare Vorgänge verwandelst. Kapitel 9 gibt diesen Funktionen umfangreichere Informationen, indem es Dictionaries einführt und Sammlungstypen vergleicht.
Aufgabe
Baue das interaktive Menü aus Kapitel 7 mit vier Funktionen neu auf.
Anforderungen:
Definiere
add_item(items). Die Funktion fragtWhat should I add?ab, entfernt umgebende Leerzeichen aus der Antwort, hängt sie an und gibtAdded:gefolgt vom Eintrag aus.Definiere
show_items(items). Die Funktion gibt bei einer leeren ListeThe list is empty.aus, andernfalls jeden Eintrag in einer nummerierten Zeile, beginnend bei1.Definiere
show_count(items). Die Funktion gibtItems stored:gefolgt von der Länge aus.Definiere
run_menu(items). Die Funktion fragt wiederholtCommand (add, list, count, quit):ab und bereinigt die Antwort mit.strip().lower().Innerhalb von
run_menumüssen die Zweigeadd,listundcountdie passenden Funktionen aufrufen.quitgibtGoodbye.aus und beendet die Schleife.Ein unbekannter Befehl gibt
I do not know that command.aus, und die Schleife läuft weiter.Weise nach allen Funktionsdefinitionen
menu_titleeinen nicht leeren String deiner Wahl zu und erstelle eine leere Liste namensitems.Gib den Titel aus, rufe
run_menu(items)auf und gib danachFinal count:gefolgt von der endgültigen Länge aus.
Wähle deinen eigenen Titel und deine eigenen Einträge. Behalte jede vorgegebene Eingabeaufforderung und Nachricht exakt bei, damit das Verhalten geprüft werden kann.