Eingaben von deinen Nutzern einlesen — input() und Typumwandlung
Lesen, was jemand mit input() eingibt, warum das Ergebnis immer ein str ist und welche Fehler auftreten, wenn du es mit int() und float() umwandelst.
Wie möchtest du lernen?
Das Problem, das wir lösen
Bisher standen alle Zahlen direkt in der Datei. Um das Programm mit anderen Zahlen laufen zu lassen, musstest du die Datei öffnen und sie bearbeiten.
Echte Programme funktionieren nicht so. Ein Programm fragt nach, und die Person, die es benutzt, antwortet.
In Python übernimmt input() dieses Fragen. Das lernt man schnell. Aber es kommt mit einer Regel, über die jeder, der neu programmiert, mindestens einmal stolpert: Was input() zurückgibt, ist immer Text — auch dann, wenn die Person eine ganz normale Zahl eingegeben hat. Wer diese eine Regel nicht kennt, für den geht schon das erste Rechenprogramm kaputt.
Am Ende dieses Kapitels kannst du
- Mit
input()lesen, was jemand eingibt, und dabei eine klare Frage stellen - Erklären, warum die Eingabe immer ein
strist - Sie mit
int()undfloat()in eine Zahl umwandeln - Einen
TypeError, einenValueErrorund eine falsche Antwort ohne Fehlermeldung voneinander unterscheiden - Eingaben so bereinigen, dass ein überflüssiges Leerzeichen dein Programm nicht bricht
Voraussetzungen: Arbeiten mit Text — Indexing, Slicing und f-Strings.
So funktioniert input()
name = input("What is your name? ")
print(f"Hello, {name}!")Starte es:
What is your name? Rafi
Hello, Rafi!Drei Dinge passieren hier. input() zeigt die Frage in der Klammer an; dann hält es an und wartet, bis die Person etwas eingegeben und Enter gedrückt hat; dann gibt es das Eingegebene zurück, und wir speichern es in name.
Beachte das Leerzeichen am Ende der Frage — "What is your name? ". Ohne es klebt das Eingegebene direkt am Fragezeichen und sieht falsch aus.
Diese Programme müssen im Terminal laufen.input()wartet darauf, dass jemand tippt, deshalb funktioniert es nicht auf einer Website oder in einer Editor-Vorschau. Startepython ask.pyin deinem eigenen Terminal — so funktioniert dieser ganze Kurs ohnehin.
Die Regel, über die alle einmal stolpern
age = input("Your age: ")
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'str'>
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 3, in <module>
print("Next year:", age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to strDie Person hat 22 getippt. Auf dem Bildschirm steht eine Zahl. Und type(age) sagt str. (Die File-Zeile zeigt den vollen Pfad deiner Datei, auf deinem Computer sieht sie also anders aus.)
Der Grund leuchtet ein, wenn man darüber nachdenkt: Eine Tastatur erzeugt Zeichen, keine Zahlen. Jemand könnte 22 tippen, oder abc, oder 12.5. input() könnte raten — „das sieht nach einer Zahl aus, also wandle ich es um“ —, aber dann würde dieselbe Codezeile manchmal einen str und manchmal einen int zurückgeben, und du könntest im Voraus nie wissen, welcher. Deshalb hält Python an einer Regel fest: immer Text. Das Umwandeln ist deine Aufgabe.
int() und float()
age = input("Your age: ")
age = int(age)
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'int'>
Next year: 23Die beiden Schritte passen in eine Zeile, und so schreibt man es meist:
age = int(input("Your age: "))
print("Next year:", age + 1)Lies es von innen nach außen: input() hat Text erzeugt, int() hat ihn in eine ganze Zahl verwandelt, und das Ergebnis ist in age gelandet.
Für Dezimalzahlen nimmst du float():
price = float(input("Price: "))
print("With tax:", round(price * 1.15, 2))Price: 249.50
With tax: 286.92Welche du nimmst: int für Dinge, die du zählst (Alter, Anzahl, Mengen), float für Dinge, die du misst (Preise, Gewichte, Durchschnitte).
Zwei Fehler und ein Fehler ohne Fehlermeldung
Wenn die Umwandlung fehlt oder die Eingabe ungültig ist, können drei verschiedene Dinge passieren. Die Namen sind leicht zu verwechseln, deshalb schau sie dir nebeneinander an.
TypeError — der Typ ist falsch. Du hast die Umwandlung vergessen und wolltest eine Zahl zu Text addieren:
qty = input("Quantity: ")
print(qty + 2)Quantity: 3
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 2, in <module>
print(qty + 2)
~~~~^~~
TypeError: can only concatenate str (not "int") to strqty enthält den Text "3", und + mit Text kann nur einen weiteren Textbaustein anhängen, keine Zahl. Python rät nicht, ob du addieren oder anhängen wolltest — also hält es an.
Kein Fehler überhaupt — nur eine falsche Antwort. Schreib jetzt * statt +, wieder ohne Umwandlung:
qty = input("Quantity: ")
print(qty * 2)Quantity: 3
33Diesmal gibt es überhaupt keinen Fehler. "3" * 2 bedeutet den Text zweimal — "33". Das Programm lief durch, und die Antwort ist falsch. Eine stille falsche Antwort ist schlimmer als ein Fehler, denn nichts warnt dich davor.
ValueError — der Typ stimmt, aber der Text ist keine Zahl:
age = int(input("Your age: "))Your age: twenty
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 1, in <module>
age = int(input("Your age: "))
^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'int() wäre bereit, die Aufgabe zu erledigen, nur nicht mit 'twenty'. Die Meldung nennt sogar den betreffenden Wert, in Anführungszeichen am Ende.
Eine heimtückische, aber sehr reale Falle:
count = int(input("Count: "))Tippst du 12.5, löst auch das einen ValueError aus — denn int() akzeptiert Text mit einem Dezimalpunkt nicht. Sind Dezimalzahlen möglich, nimm den Wert mit float() entgegen und wandle danach bei Bedarf in int() um.
Wir haben noch nicht alles, was nötig ist, um diese Fehler zu verhindern — dafür braucht es Bedingungen und Schleifen, und beides kommt in den nächsten Kapiteln. Für jetzt erkenne den Fehler und lerne, die Meldung zu lesen.
Eingabe bereinigen
Menschen tippen überflüssige Leerzeichen und mischen Groß- und Kleinschreibung. Die Methoden aus dem letzten Kapitel sind genau das Richtige dafür:
full_name = input("Name: ").strip().title()
answer = input("Continue? (yes/no) ").strip().lower()
print(f"Name is {full_name}")
print(f"Answer is {answer}")Name: rafi ahmed
Continue? (yes/no) YES
Name is Rafi Ahmed
Answer is yesMach .strip() bei allem aus input() zur Gewohnheit. Es gibt keinen Grund, dass ein Programm wegen eines einzigen zusätzlichen Leerzeichens kaputtgeht.
Ein vollständiges Beispiel
bill.py:
# Ask for one order and print a small bill
print("--- Order entry ---")
customer = input("Customer name : ").strip().title()
item = input("Item : ").strip()
quantity = int(input("Quantity : "))
unit_price = float(input("Unit price : "))
subtotal = quantity * unit_price
tax = subtotal * 0.05
total = subtotal + tax
print()
print("--- Bill ---")
print(f"Customer : {customer}")
print(f"Item : {item} x {quantity}")
print(f"Subtotal : {subtotal:.2f}")
print(f"Tax (5%) : {tax:.2f}")
print(f"Total : {total:.2f}")--- Order entry ---
Customer name : rafi ahmed
Item : notebook
Quantity : 4
Unit price : 85.50
--- Bill ---
Customer : Rafi Ahmed
Item : notebook x 4
Subtotal : 342.00
Tax (5%) : 17.10
Total : 359.10Vier Eingaben, vier verschiedene Behandlungen: Der Name wird bereinigt und großgeschrieben, der Artikel nur bereinigt, die Menge in eine ganze Zahl umgewandelt und der Preis in eine Dezimalzahl. Für jede Eingabe musst du zwei Dinge entscheiden — welchen Typ du brauchst und wie du sie bereinigst.
Wenn etwas schiefgeht
TypeError: can only concatenate str (not "int") to str Die Umwandlung fehlt. Schreib int(input(...)) oder float(input(...)).
Ich wollte multiplizieren, aber der Text wiederholt sich "3" * 2 ergibt "33". Der Wert wurde nie in int umgewandelt. Dieser Fehler ist gerade deshalb gefährlich, weil keine Meldung erscheint — gib im Zweifel type() aus.
ValueError: invalid literal for int() with base 10 Was die Person eingegeben hat, ist keine ganze Zahl — ein Wort, eine Dezimalzahl oder gar nichts (nur Enter). Sind Dezimalzahlen möglich, nimm float().
Das Programm steht da und zeigt nichts an Es wartet auf deine Eingabe. Ohne Frage an input() erscheint nichts auf dem Bildschirm, und es sieht aus, als hinge es fest. Gib immer eine Frage an.
input() funktioniert in meinem Editor nicht Manche Editoren und Online-Umgebungen können keine Eingaben annehmen. Öffne ein Terminal und starte python bill.py.
Nach Enter gibt es eine zusätzliche leere Zeile input() nimmt deinen Text entgegen und behält den abschließenden Zeilenumbruch nicht. Eine zusätzliche leere Zeile stammt fast sicher von einem eigenen print().
Schritt 4 von 6 — Vorhersagen
Prüfe dein Verständnis
Die Person tippt 42 und drückt Enter. Was gibt die zweite Zeile aus?
value = input("Number: ")
print(type(value))- A<class 'input'>
- B<class 'int'>
- C<class 'float'>
- D<class 'str'>
Die Person hat 3 eingegeben, und das Programm hat Doubled: 33 ausgegeben, ganz ohne Fehler. Warum, und was behebt es?
qty = input("Quantity: ")
print("Doubled:", qty * 2)- A`qty + qty` statt `qty * 2` zu schreiben würde es beheben
- BDer `print` braucht ein `+` statt eines Kommas
- C`input()` kann keine Zahlen lesen, also braucht man eine andere Funktion
- D`qty` ist ein `str`, und Text mit einer Zahl zu multiplizieren wiederholt ihn — es braucht `int(qty) * 2`
Was passiert, wenn die Person 12.5 eingibt?
count = int(input("Count: "))
print(count + 1)- AEin `ValueError` — `int()` akzeptiert keinen Text mit Dezimalpunkt; wenn Dezimalzahlen möglich sind, nimm `float()`
- B`count` wird `12`, weil `int()` alles nach dem Punkt abschneidet
- CEin `TypeError`, weil die Eingabe und die Variablentypen nicht zusammenpassen
- D`count` wird `13`, weil `int()` auf die nächste ganze Zahl rundet
Zum Antworten brauchst du ein Konto
Melde dich an, um deine Antworten zu prüfen
Die Fragen stehen oben, und sie im Kopf durchzuarbeiten ist der wichtige Teil. Melde dich an, um die Antworten, die Erklärungen und die dreistufigen Hinweise zu sehen.
Jetzt bist du dran
Schreibe eine Datei namens travel.py, die vier Fragen stellt und eine kleine Berechnung ausgibt:
- Den Namen des Passagiers (bereinigt, großgeschrieben)
- Wie viele Passagiere (eine ganze Zahl)
- Der Preis pro Passagier (eine Dezimalzahl)
- Der Rabatt in Prozent (eine Dezimalzahl)
Gib danach den Gesamtpreis, den Rabattbetrag und den endgültig zu zahlenden Betrag aus — alle drei auf zwei Nachkommastellen.
Wenn es funktioniert, versuch absichtlich dreimal, es zu brechen:
- Tippe
twofür die Anzahl der Passagiere — welcher Fehler erscheint, und was sagt die Meldung? - Tippe
2.5für die Anzahl der Passagiere — was passiert, und warum? - Setze ein paar Leerzeichen vor und nach dem Namen — übersteht die Ausgabe das?
Wenn die Antwort auf die letzte Frage ja ist, schreibst du schon besseren Code als der durchschnittliche Einsteiger. Die Lösungen für die beiden anderen Fälle kommen, sobald du Bedingungen und Schleifen hast.
In dieser Mission steckt noch mehr
Was du oben gelesen hast, ist die vollständige Mission – nichts wurde herausgekürzt. Pro ergänzt:
- Was wirklich unter der Haube passiert – wie Python das ausführt
- Die vollständige Lösung der Übung, Schritt für Schritt erklärt
- Schwierigere Zusatzübungen
- Die Interviewfrage zu diesem Thema, mit Musterantwort
Schritt 6 von 6
Herausforderung — das Kapitel-Quiz
Zehn Fragen von leicht bis schwer. Die letzten sind absichtlich knifflig.
Melde dich an, um das Quiz zu machen