Programme planen, bauen und testen · Übung
Strukturiere Code mit einem Sicherheitsnetz um
Refactoring funktioniert am besten, wenn eine strukturelle Änderung einen klaren Zweck hat. Hier besteht die Änderung darin, wiederholte Stringverkettung durch eine Liste fertiger Zeilen und eine Stringmethode zu ersetzen.
Baue einen String aus einer Liste von Strings
Beginne mit drei einzelnen Strings in einer Liste:
Das Ergebnis ist ein String:
plan -> build -> test
Der Methodenaufruf " -> ".join(stages) verwendet zwei Teile, die du bereits kennst. " -> " ist der Trennstring, und stages ist eine Liste, deren Elemente Strings sind. Die Methode .join() gibt einen neuen String zurück, mit dem Trennstring zwischen jedem benachbarten Paar. Sie fügt den Trennstring weder vor dem ersten noch nach dem letzten Element hinzu.
Der Trennstring steht vor dem Punkt, weil .join() eine Stringmethode ist. Die Liste liefert die Strings, die verbunden werden sollen. stages.join(" -> ") vertauscht diese Aufgaben, und eine Liste stellt .join() nicht bereit.
Jedes Element, das an .join() übergeben wird, muss ein String sein. Wenn ein Bericht eine Zahl enthält, baue die vollständige Zeile mit einem f-String, bevor du sie in die Liste aufnimmst:
score = 2
lines = ["QUIZ REPORT", f"Score: {score}/3"]
Sage voraus, wo das Trennzeichen steht
Sage vor dem Ausführen dieses Beispiels die genaue Ausgabe voraus. Wie viele Zeilen wird es ausgeben, und warum wird es am Anfang und Ende keine leere Zeile geben?
Die Liste enthält drei Strings. Deshalb setzt .join() zwei Zeilenumbruchzeichen dazwischen. Die eckigen Klammern, Kommas und Anführungszeichen gehören zur Listendarstellung. Sie erscheinen nicht im zurückgegebenen String.
Verwende .join() als Refactoring-Schritt
Die vorgegebene Funktion quiz_report() gibt bereits den zugesagten Bericht mit drei Zeilen zurück. Sie baut ihn auf, indem sie jeweils eine Zeile anhängt:
report = "QUIZ REPORT"
report = report + f"\nAnswered: {len(responses)}"
report = report + f"\nScore: {score}/{len(responses)}"
return report
Strukturiere diese Zeilen zu einer Liste vollständiger Strings um. Verbinde sie dann mit "\n":
lines = [
"QUIZ REPORT",
f"Answered: {len(responses)}",
f"Score: {score}/{len(responses)}",
]
return "\n".join(lines)
Das trennt zwei Aufgaben. Die Liste hält fest, was jede Berichtszeile sagt, und .join() legt fest, was zwischen die Zeilen gehört.
Refactoring verändert die Struktur von funktionierendem Code, ohne sein Verhalten absichtlich zu ändern. Behalte die vorhandenen Zusicherungen bei, nimm diese eine strukturelle Änderung vor und führe die Prüfungen erneut aus. Wenn sie für die vorbereitete und die leere Antwortliste weiterhin erfolgreich sind, hast du einen Beleg dafür, dass das Refactoring den Bericht erhalten hat.
Welcher Ausdruck gibt einen String zurück, in dem jedes Element aus lines auf einer eigenen Zeile steht?
Aufgabe
Die vorgegebene Funktion quiz_report(responses) erzeugt bereits den erforderlichen Bericht. Strukturiere nur die Art um, wie sie diesen Bericht zusammensetzt:
Lass die Schleife zur Punkteberechnung und ihren Aufruf von
answers_match()unverändert.Erstelle nach der Schleife eine Liste mit den drei vollständigen Berichtszeilen:
QUIZ REPORT, der Anzahl beantworteter Fragen und der Punktzahl.Gib einen String zurück, indem du
"\n".join(...)mit dieser Liste von Strings verwendest.Behalte beide vorbereiteten Zusicherungen zum Verhalten bei und führe sie nach dem Refactoring erneut aus.
Behalte die Funktionsnamen, die vorbereiteten Daten und die abschließende Ausgabe bei. Die Ausgabe muss unverändert lauten:
QUIZ REPORT
Answered: 3
Score: 2/3