Abschnitt 2 · Lektion 5
Typen ansehen und umwandeln
"3" + "3" ergibt 33, und zwar ohne jede Fehlermeldung. Wenn Werte aus einer Datei oder einer
Eingabe kommen, hat man so etwas ständig vor sich. Dort kommt nämlich alles als Text an.
Solange ein Wert direkt im Code steht, sieht man ihm an, was er ist. 3 ist eine Zahl, "Brot" ist
Text. Ab der nächsten Lektion kommen Werte von außen, und dann ist das nicht mehr so klar. Dann
willst du zweierlei wissen. Was für ein Wert ist das eigentlich? Und wie macht man daraus das, was
man braucht?
Welcher Typ ein Wert ist
Jeder Wert in Python hat einen Typ (type). Der Typ sagt, was für ein Wert es ist. Drei kennst du
schon, nämlich ganze Zahlen, Kommazahlen und Text. Mit type() kannst du Python danach fragen.
print(type(42))
print(type(4.2))
print(type("42")) Die Antworten sehen etwas umständlich aus, <class 'int'>. Das Entscheidende steht aber in den
einfachen Anführungszeichen, also int, float und str. Interessant ist die dritte Zeile. "42"
sieht aus wie eine Zahl, ist aber Text, weil es in Anführungszeichen steht. Für Python sind das zwei
Zeichen, eine 4 und eine 2. Mit Rechnen hat das nichts zu tun.
Im fertigen Programm braucht man type() selten, bei der Suche nach einem Fehler dagegen oft. Wenn
etwas nicht so rechnet wie gedacht, ist „Was ist das eigentlich?“ eine sehr gute erste Frage. Im
Reiter Debug siehst du die Antwort übrigens auch, an jeder Zeile. Text steht dort in
Anführungszeichen, eine Zahl ohne.
Warum es auf den Typ ankommt
Alles, was ein Programm von außen bekommt, kommt als Text an. Eine Eingabe über die Tastatur, eine Zeile aus einer Datei, eine Zelle aus einer Tabelle. Überall liest Python nur Zeichen, und ob diese Zeichen eine Zahl bedeuten, weiß es nicht. Das musst du ihm sagen.
menge = "3"
preis = "19.99"
print(menge + menge)
print(int(menge) + int(menge))
print(float(preis) * 2)
print(str(42) + " Stück") Die erste Ausgabe ist 33 und nicht 6. Zwei Texte mit + werden aneinandergehängt, das kennst du
schon, und "3" + "3" ist eben "33". Das ist einer der häufigsten Fehler in Programmen, die etwas
einlesen. Und das Tückische daran ist, dass keine Fehlermeldung kommt. Nur ein falsches Ergebnis.
Die Lösung sind drei Umwandlungen. Jede heißt so wie der Typ, der dabei herauskommt:
int(text)macht aus Text eine ganze Zahl.int("3")ist3.float(text)macht aus Text eine Kommazahl.float("19.99")ist19.99.str(wert)macht aus irgendetwas Text.str(42)ist"42".
Damit ist auch der TypeError mit Text und Zahl erledigt. "42" + 1 geht nicht. "42" + str(1)
ergibt den Text 421, und int("42") + 1 ergibt die Zahl 43. Welche von beiden Antworten richtig
ist, weiß nur, wer weiß, was gemeint war. Deshalb lässt Python dich entscheiden.
Wenn sich Text nicht umwandeln lässt
Nicht jeder Text lässt sich in eine Zahl verwandeln. int("Brot") geht offensichtlich nicht. Und
dann gibt es einen Fall, der in Deutschland ständig vorkommt.
preis = "3,50"
print(float(preis)) ValueError: could not convert string to float: '3,50'. Aus "3,50" kann Python keine Kommazahl
machen, weil es das Komma nicht als Dezimalzeichen kennt. Bei int("3,5") klingt die Meldung
ähnlich, invalid literal for int() with base 10. Auf gut Deutsch ist das keine ganze Zahl in
Zehnerschreibweise.
Ein ValueError ist neu, und den Unterschied zum TypeError sieht man sich am besten einmal genau
an. Ein TypeError heißt, dass der Typ falsch ist. Text und Zahl mit + verbinden geht grundsätzlich
nicht, egal welcher Text. Ein ValueError heißt, dass der Typ stimmt und der Inhalt nicht. float()
nimmt Text, nur eben nicht diesen.
Deutsche Zahlen mit Komma stehen überall, in Tabellen, in Kontoauszügen und in jeder Datei aus einem deutschen Programm, und deshalb läuft dir dieser ValueError noch öfter über den Weg. In Abschnitt 6 entsteht dafür ein eigenes kleines Werkzeug, und in Abschnitt 12 werden damit ganze Tabellen eingelesen. Wenn die Meldung bis dahin kommt, steht irgendwo ein Komma, wo Python einen Punkt erwartet.
Zum Mitnehmen
Alles, was von außen kommt, kommt als Text, auch wenn es aussieht wie eine Zahl. int(), float() und str() machen daraus, was man braucht.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.