0%

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:

Try it

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?

Try it

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:

  1. Lass die Schleife zur Punkteberechnung und ihren Aufruf von answers_match() unverändert.

  2. Erstelle nach der Schleife eine Liste mit den drei vollständigen Berichtszeilen: QUIZ REPORT, der Anzahl beantworteter Fragen und der Punktzahl.

  3. Gib einen String zurück, indem du "\n".join(...) mit dieser Liste von Strings verwendest.

  4. 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