Aufgabenblock — AFB III
Begründen statt nur ausführen: Fehlermeldungen deuten, Programme vergleichen, Aussagen beurteilen und Programme weiterentwickeln. Formuliere deine Antwort erst selbst in ganzen Sätzen, bevor du die Musterlösung aufklappst.
Lina erwartet die Ausgabe 11. Stattdessen erscheint 10 und danach eine Fehlermeldung. Begründe die Ausgabe und die Fehlermeldung und gib die Korrektur an.
def verdopple(x): print(2 * x)ergebnis = verdopple(5)print(ergebnis + 1)
10 TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
Hinweis: Überlege, was in der Variablen ergebnis gespeichert wird.
Musterlösung anzeigen (zählt als erledigt)
Musterlösung: Die Funktion zeigt 2 · 5 = 10 zwar mit print in der Konsole an, gibt aber nichts zurück. Eine Funktion ohne return liefert den besonderen Wert None. In Zeile 4 wird also ergebnis = None gespeichert. In Zeile 5 soll None + 1 gerechnet werden — das geht nicht, deshalb der TypeError. Richtig ist return 2 * x statt print: Dann ist ergebnis = 10 und die Ausgabe 11.
def verdopple(x): return 2 * xergebnis = verdopple(5)print(ergebnis + 1)
Das Programm soll dreimal einen Stern ausgeben, bricht aber mit TypeError: 'float' object cannot be interpreted as an integer ab. Begründe den Fehler, obwohl 9 durch 3 doch aufgeht, und vergleiche zwei Möglichkeiten der Korrektur.
anzahl = 9for i in range(anzahl / 3): print("*")
Hinweis: Welchen Datentyp liefert / — und welchen braucht range()?
Musterlösung anzeigen (zählt als erledigt)
Musterlösung: Der Operator / liefert in Python immer einen float, auch wenn die Division aufgeht: 9 / 3 ergibt 3.0. range() kann aber nur mit ganzen Zahlen (int) zählen — mit 3.0 weiß Python nicht, wie oft wiederholt werden soll. Korrektur 1: anzahl // 3 teilt ganzzahlig und liefert 3. Korrektur 2: int(anzahl / 3) wandelt 3.0 in 3 um. Beide funktionieren hier; // ist kürzer und macht schon beim Lesen klar, dass eine ganze Zahl gemeint ist. Bei anzahl = 10 liefern beide 3 — der Rest fällt jeweils weg.
anzahl = 9for i in range(anzahl // 3): print("*")
Beide Programme geben 2, 4, 6, 8, 10 untereinander aus. Vergleiche sie und erläutere an einem eigenen Beispiel, wann nur eine while-Schleife in Frage kommt.
for zahl in range(2, 11, 2): print(zahl)
zahl = 2while zahl <= 10: print(zahl) zahl = zahl + 2
Hinweis: Frag dich, ob man vor dem Start weiß, wie oft wiederholt wird.
Musterlösung anzeigen (zählt als erledigt)
Musterlösung: Beide Programme liefern dieselbe Ausgabe. Bei der for-Schleife kümmert sich range(2, 11, 2) um alles: Startwert, Schrittweite und Ende. Bei der while-Schleife muss man den Startwert selbst setzen, die Bedingung formulieren und zahl in der Schleife erhöhen — vergisst man die letzte Zeile, entsteht eine Endlosschleife. Deshalb nimmt man for, wenn die Anzahl der Durchläufe vorher feststeht. while braucht man, wenn eine Bedingung entscheidet und niemand vorher weiß, wie oft es nötig ist — zum Beispiel eine PIN-Abfrage, die so lange wiederholt wird, bis die richtige PIN kommt:
pin = input("PIN? ")while pin != "1234": print("Falsch, noch einmal.") pin = input("PIN? ")print("Entsperrt!")
