Typen, mit denen du rechnen kannst
Welches Alter ist das beste Alter für Programmierer_innen?
Natürlich ist 42 ist das beste Programmiereralter! Warum? »42« ist die Antwort auf die Frage nach dem Leben, dem Universum, und allem… wenigstens, wenn wir Douglas Adams’ Per Anhalter durch die Galaxis vertrauen. Und viele Programmiererinnen und Programmierer haben einen Narren an diesem Buch gefressen…
Wäre es also nicht gut, zu wissen, wie lange es noch dauert, bis du 42 Jahre alt bist?
Das Programm, das du gerade geschrieben hast, eignet sich wunderbar, in diese Richtung erweitert zu werden – immerhin wird neben dem Namen auch das Alter abgefragt, und damit sollte sich die Zeit bis zum 42. Geburtstag doch gut ausrechnen lassen!
Versuchen wir es also einmal hiermit: (Tippe diesen Code ab!)
# Hier wird begrüßt
name = input('Wie heißt Du? ')
print('Hallo', name)
# Jetzt fragen wir nach dem Alter und rechnen die Wartezeit aus
alter = input('Wie alt bist du? ')
zeit_bis_42 = 42 - alter
# Schließlich geben wir einen informativen Satz aus
print(name + ' muss noch ' + zeit_bis_42 + ' Jahre warten.')
Was erwartest du, wenn du das Programm laufen lässt?
Das könnte man denken, doch wenn du dieses Programm laufen lässt, wird ein Fehler ausgegeben. Versuche es selbst einmal!
Es gibt zwar einen Fehler (versuche es selbst einmal, laufen zu lassen), doch das liegt nicht an den Hashtags. (Das #
ist in Python das Kommentarzeichen – alles, was danach in einer Zeile kommt, wird vom Compiler ignoriert. Programmierer_innen nutzen dies, um Kommentare in den Code zu schreiben.
Das stimmt! Woran das liegt, werden wir gleich sehen. Die Fehlermeldung, die wir erhalten, weist uns schon darauf hin:
Wie heißt Du? Jan
Hallo Jan
Wie alt bist du? 42
Traceback (most recent call last):
File "/home/jan/typenzumrechnen.py", line 7, in <module>
zeit_bis_42 = 42 - alter
TypeError: unsupported operand type(s) for -: 'int' and 'str'
Bekommst du auch diese Fehlermeldung?
Offensichtlich funktioniert irgendetwas nicht. Zum Glück kann uns die Fehlermeldung weiterhelfen! Wenn du genau hinsiehst, ist von »line 7« die Rede; das ist die siebte Zeile. Die ist sogar angegeben: in zeit_bis_42 = 42 - alter
hat irgendetwas nicht geklappt.
Neben dem Ort erhalten wir außerdem noch Informationen über die Art des Fehlers, auch wenn dir die jetzt vielleicht noch nicht viel helfen. In der letzten Zeile steht, ein »TypeError« sei passiert, und das irgendetwas mit dem Minuszeichen nicht stimme. Kannst du das soweit erkennen?
Um genau zu verstehen, was hier nicht klappt, wechseln wir in den REPL und sehen uns genau an, was es hier mit der Zahl 42 und unserer Variable alter
auf sich hat. Wenn du das Programm gerade hast laufen lassen, lässt sich in Thonnys REPL noch die Variable alter
ausgeben:
>>> alter
'42'
Je nachdem, welches Alter du angegeben hast, steht hier eine andere Zahl, doch die Ausgabe sollte ähnlich aussehen. Gib jetzt nur die Zahl 42 ein, und vergleiche die Ausgabe:
>>> 42
42
Fällt dir der Unterschied auf?
Wirklich nicht? Wo überall siehst du oben denn dieses Zeichen: '
?
Ja – beim Programmieren kommt es auf jedes einzelne Zeichen an, und diese einfachen Anführungszeichen haben eine Bedeutung!
Einmal sehen wir die Zahl mit, und einmal ohne Anführungszeichen! Das liegt daran, dass wir es mit verschiedenen Typen von Werten zu tun haben!
Eingaben, die wir auf der Konsole machen, werden zunächst immer als Zeichenkette eingelesen. Wenn wir einer Funktion eine Zeichenkette übergeben, müssen wir sie immer in Anführungszeichen schreiben – das weißt du schon. (Denk’ z.B. zurück an die print()
-Funktion.) Der Inhalt der Variable alter
wird ebenfalls in Anführungszeichen angezeigt – das deutet darauf hin, dass es sich um eine solche Zeichenkette handelt. Wir können das auch im REPL überprüfen, und zwar so:
>>> type(alter)
<class 'str'>
Was Klassen sind, wirst du später lernen. 'str'
steht allerdings für String, und dieses Wort lässt sich neben »Schnur« oder »Saite« auch als »Zeichenkette« übersetzen. String ist hier der so genannte Datentyp.
Auch Zahlen können wir uns auf diese Weise genau ansehen:
>>> type(42)
<class 'int'>
'int'
steht für Integer, und das lässt sich mit Ganzzahl übersetzen.
Offensichtlich unterscheidet Python zwischen Zeichenketten (Strings) und Ganzzahlen (Integern), und weigert sich, beide voneinander abzuziehen. Was wird wohl herauskommen, wenn du foglende Zeile im REPL eingibst:
>>> 42 - 'zweiundvierzig'
Was glaubst du?
Vom Ergebnis her stimmt das vielleicht, doch versteht der Computer nicht ohne weiteres die Zeichenkette »zweiundvierzig« als Zahl. Das ist so ähnlich, wie wenn du drei Äpfel hättest, und jemand forderte dich auf, davon zwei Birnen abzuziehen…
Vom Ergebnis her stimmt das vielleicht, doch versteht der Computer nicht ohne weiteres die Zeichenkette »zweiundvierzig« als Zahl. Das ist so ähnlich, wie wenn du drei Äpfel hättest, und jemand forderte dich auf, davon zwei Birnen abzuziehen…
Richtig! Es wird ein Fehler angezeigt! (Programmierer_innen sagen auch: es wird ein Fehler geworfen.)
>>> 42 - 'zweiundvierzig'
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'int' and 'str'
Solange die Eingabe, die von der Konsole gelesen wurde, nicht als Zahl behandelt wird, lässt sich auch nicht mit ihr rechnen. Sobald nur Zahlen im Spiel sind, benimmt sich Python hingegen wie ein ganz normaler Taschenrechner:
>>> 42 - 11
31
Auch wenn du die Anführungszeichen nicht mit eingeben hast, behandelt Python alles, was von der Konsole eingelesen wird als Zeichenkette (str
). Zum Glück lässt sich Abhilfe schaffen: wir können eine Zeichenkette, die nur Zahlen enthält, in eine Ganzzahl umwandeln, und zwar mit der eingebauten Funktion int()
:
>>> int('42')
42
Das geht nur dann schief, wenn die Zeichenkette etwas anderes als Zahlen enthält:
>>> int('zwei')
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'zwei'
Wenn du nun also das Programm an der entscheidenden Stelle erweiterst, können wir ausrechnen lassen, wie lange du noch bis zum 42. Lebensjahr warten musst:
# Hier wird begrüßt
name = input('Wie heißt Du? ')
print('Hallo', name)
# Jetzt fragen wir nach dem Alter und rechnen die Wartezeit aus
alter = input('Wie alt bist du? ')
alter_als_zahl = int(alter)
zeit_bis_42 = 42 - alter_als_zahl
# Schließlich geben wir einen informativen Satz aus
print(name + ' muss noch ' + zeit_bis_42 + ' Jahre warten.')
Wird das Programm jetzt die Zeit ausrechnen?
Ausrechnen durchaus, aber anzeigen: leider nicht!
Das stimmt!
Wir sehen einen neuen Fehler:
Wie heißt Du? Jan
Hallo Jan
Wie alt bist du? 42
Traceback (most recent call last):
File "…/typenzumrechnen.py", line 11, in <module>
print(name + ' muss noch ' + zeit_bis_42 + ' Jahre warten.')
TypeError: can only concatenate str (not "int") to str
Zum Glück kennst du dich inzwischen mit Fehlermeldungen aus! Jetzt ist Zeile 11 betroffen, und den Fehler verstehen wir auch schon… die letzten Englisch-Kenntnisse zusammengekratzt, und wir übersetzen: »can only concatenate str (not “int”) to str« heißt so viel wie »Ich kann nur zusammenhängen Zeichenkette (nicht Integer) mit Zeichenkette«. Noch Fragen?
Probiere es aus. Klappt es?
Für die Umwandlung von Zahlen in Zeichenketten gibt es eine eingebaute Funktion, und die heißt – wer hätte das gedacht? – str()
. Wir testen…
>>> str(42)
'42'
Für die Umwandlung von Zahlen in Zeichenketten gibt es eine eingebaute Funktion, und die heißt – wer hätte das gedacht? – str()
. Wir testen…
>>> str(42)
'42'
Wir fügen also an der richtigen Stelle noch ein str(zeit_bis_42)
ein. Übrigens kann der Zwischenschritt von vorhin, bei dem wir eine eigene Variable für die Umwandlung zur Zahl eingeführt haben, auch weggelassen werden. Kürzer sieht das Programm also nun so aus:
# Hier wird begrüßt
name = input('Wie heißt Du? ')
print('Hallo', name)
# Jetzt fragen wir nach dem Alter und rechnen die Wartezeit aus
alter = input('Wie alt bist du? ')
zeit_bis_42 = 42 - int(alter)
# Schließlich geben wir einen informativen Satz aus
print(name + ' muss noch ' + str(zeit_bis_42) + ' Jahre warten.')
Siehst du die Änderungen?
Statt
alter_als_zahl = int(alter)
zeit_bis_42 = 42 - alter_als_zahl
lässt sich auch schreiben:
zeit_bis_42 = 42 - int(alter)
Wenn du gelernt hast, wie diese Typverwandlung funktioniert, ist das übersichtlicher. Programmierer_innen sprechen übrigens auch von einem Cast.
Lass nun das Programm laufen, und du solltest eine Ausgabe erhalten, die so ähnlich aussieht wir hier:
Wie heißt Du? Jan
Hallo Jan
Wie alt bist du? 42
Jan muss noch 0 Jahre warten.
Das glaube ich. Ein großer Teil des Programmierens ist die Fehlersuche, und die kann manchmal sehr frustrierend sein. Fehlermeldungen helfen uns dabei, Programmfehler zu finden. Diesen Vorgang nennt man auch Debuggen.
Na gut, hier hätte ich eine Aufgabe:
Dein Kumpel Wolff-Christoph ist Sportreporter, und er hat ein Programm geschrieben, das ihm helfen soll, seinen Job gut zu machen. Leider produziert es ganz unsinnige Ergebnisse, und am letzten Spieltag hat Wolff-Christoph sich ganz furchtbar blamiert… Kannst du ihm helfen?
tore_heim = input('Wie viele Tore erzielte die Heimmannschaft? ')
tore_ausw = input('Wie viele Tore erzielte die Auswärtsmannschaft? ')
tore_insgesamt = tore_heim + tore_ausw
print('Es wurden insgesamt ' + tore_insgesamt + ' Tore erzielt.')
Tippe den Code ab, lass das Programm laufen und mache einige Testeingaben!
Übrigens gibt es verschiedene Arten von Fehlern!
Wenn ein Programm mit Fehlermeldungen abbricht oder gar nicht erst startet, können Syntaxfehler die Ursache sein. Syntax ist so etwas ähnliches wie Grammatik, und wenn ich statt name = 'Jan'
z.B. name := "Jan"
schreibe, ist diese Syntax in Python nicht gültig.
Daneben gibt es semantische Fehler. (Semantik beschäftigt sich mit der Bedeutung von Dingen.) Der Code lässt sich ausführen und produziert Ergebnisse, die aber manchmal auf sehr unterhaltsame Weise falsch sind.
Welcher Fehlertyp liegt hier vor?
Untersuche den Fehler genau und behebe ihn!
Super! Gut gemacht!
Das +
macht hier offensichtlich nicht den Job, den wir von ihm erwarten. Das wird sich sicher ändern, wenn es nicht Zeichenketten miteinander verbinden kann, sondern Zahlen bekommt!
In tore_insgesamt
wird eine Zahl abgespeichert, wenn auf der rechten Seite ebenfalls Zahlen stehen:
tore_insgesamt = int(tore_heim) + int(tore_ausw)
Kommst du auch mit…
Die Fehlermeldung sollte dir bekannt vorkommen: str
und int
können nicht konkateniert werden. (Die Zahl muss also wieder rückumgewandelt werden.)
print('Es wurden insgesamt ' + str(tore_insgesamt) + ' Tore erzielt.')
Sieht dein Code jetzt auch so aus?
tore_heim = input('Wie viele Tore erzielte die Heimmannschaft? ')
tore_ausw = input('Wie viele Tore erzielte die Auswärtsmannschaft? ')
tore_insgesamt = int(tore_heim) + int(tore_ausw)
print('Es wurden insgesamt ' + str(tore_insgesamt) + ' Tore erzielt.')
Eine kleine Pause? Die hast du Dir verdient!
Next in Programmieren mit Python:
Level 1-3: Wenn das so ist, möchte ich das gar nicht wissen…
Am Ende wirst du auch die richtige Antwort auf diese Frage kennen: »Ist zwei mal zwei minus eins zwei oder drei?«…