mitmario.dev

Typen ansehen und umwandeln

Python Sandbox 3 Min Lesezeit 3 BeispieleLektion 5 von 8

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

Welcher Typ steckt drin
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.

Text, der wie eine Zahl aussieht
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") ist 3.
  • float(text) macht aus Text eine Kommazahl. float("19.99") ist 19.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.

Wenn sich Text nicht umwandeln lässt
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, kostenlos

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