Seite 1 von 1
Frage zu Datentypen Fehler
Verfasst: Freitag 28. Januar 2022, 20:36
von Unxendlicher
Guten Abend liebes Forum,
Ich bin noch eher neu und möchte in meiner Freizeit das programmieren lernen.
Ich sitze jetzt schon eine Weile an einem Programm und finde auch keine passende Lösung dazu:
Code: Alles auswählen
import time
zahl1 = input("Gib eine Zahl ein: ")
if type(zahl1) == int :
zahl2 = input("Gib noch eine Zahl ein: ")
if type(zahl2) == int:
endergebnis = print(zahl1 + zahl2)
else:
print("Keine Zahl! ")
else:
print("Keine Zahl! ")
time.sleep(0.5)
print("")
print("Programmende")
Ich möchte das NUR wenn zahl1 und zahl2 == int sind das Programm rechnet ansonsten "Keine Zahl" ausgegeben wird.
Aber sobald ich zb 5 eingebe wird es ja als str automatisch genommen.
Aber wenn ich es so schreibe:
Code: Alles auswählen
zahl1 = int(input("Gib eine Zahl ein: "))
zahl2 = int(input("Gib noch eine Zahl ein: "))
Bekomme ich eine Fehlermeldung weil sich zb. dann ein Buchstabe wie "j" nicht als int konvertieren lässt.
Ich möchte aber das anstatt die rote Fehlermeldung einfach das in der else Bedingung stehende ausgegeben wird.
Danke fürs lesen und ich hoffe dass mir jemand hier weiterhelfen kann

Re: Frage zu Datentypen Fehler
Verfasst: Samstag 29. Januar 2022, 08:37
von gerr
Hallo,
mit try..except wandelst Du die Eingabe in int um und fängst eine Fehlermeldung ab falls die Eingabe keine Zahl ist.
Und doppelte Zeilen solltest Du vermeiden, immer wenn man Code mehr als einmal benötigt macht man eine Funktion daraus:
Code: Alles auswählen
import time
def zahleneingabe(text):
zahl = input(text)
try:
return int(zahl)
except ValueError:
print("Keine Zahl")
return zahleneingabe("Nächster Versuch: ")
zahl1 = zahleneingabe("Gib eine Zahl ein: ")
zahl2 = zahleneingabe("Gib noch eine Zahl ein: ")
print(f"Ergebnis: {zahl1 + zahl2}")
time.sleep(0.5)
print("")
print("Programmende")
Grüße,
gerr
Re: Frage zu Datentypen Fehler
Verfasst: Samstag 29. Januar 2022, 17:52
von __blackjack__
@gerr: Rekursion ist kein Ersatz für Schleifen. Das funktioniert nicht wirklich bei Programmiersprachen die keine Endrekursion weg optimieren.
Re: Frage zu Datentypen Fehler
Verfasst: Samstag 29. Januar 2022, 22:38
von Unxendlicher
gerr hat geschrieben: Samstag 29. Januar 2022, 08:37
Hallo,
mit try..except wandelst Du die Eingabe in int um und fängst eine Fehlermeldung ab falls die Eingabe keine Zahl ist.
Und doppelte Zeilen solltest Du vermeiden, immer wenn man Code mehr als einmal benötigt macht man eine Funktion daraus:
Code: Alles auswählen
import time
def zahleneingabe(text):
zahl = input(text)
try:
return int(zahl)
except ValueError:
print("Keine Zahl")
return zahleneingabe("Nächster Versuch: ")
zahl1 = zahleneingabe("Gib eine Zahl ein: ")
zahl2 = zahleneingabe("Gib noch eine Zahl ein: ")
print(f"Ergebnis: {zahl1 + zahl2}")
time.sleep(0.5)
print("")
print("Programmende")
Grüße,
gerr
Hallo,
Vielen Danke für die Antwort, ich war noch nicht so weit in Python das ich mit def und return except arbeite aber jetzt hab ich es nachgeschaut und halbwegs verstanden nur eine frage konnte ich mir nicht beantworten.
Und zwar wozu brauche ich nach dem except das "ValueError" ?
Bei mir klappt alles auch ohne das also nur mit except.
Re: Frage zu Datentypen Fehler
Verfasst: Samstag 29. Januar 2022, 23:03
von Sirius3
Nackte `except` darf man nicht verwenden, weil damit alle Fehler abgefangen werden, auch viele typische Programmierfehler. Man darf aber nur selche Fehler abfangen, die man auch erwartet und daher sinnvoll behandeln kann, hier eben der ValueError.
Re: Frage zu Datentypen Fehler
Verfasst: Samstag 29. Januar 2022, 23:04
von rogerb
@Unxendlicher,
Es gibt verschiedene Fehlertypen. Indem man "except ValueError" verwendet, kann man gezielt auf den Fall reagieren, dass nicht der richtige Wert eingegeben wurde.
Der ValueError wird nämlich ausgelöst wenn die Konvertierung der Zeichenkette in eine Zahl fehlgeschlagen ist, weil zum Beispiel ein Buchstabe eingegeben wurde.
Ein nacktes except ist schlechter Programmierstil, weil damit alle Fehler, auch die unerwarteten aufgefangen werden. Bei unerwarteten Fehlern ist es besser, wenn der Programmablauf einfach mit einer Fehlermeldung abbricht, die man dann untersuchen kann.
Hier mal das Beispiel für Dezimalzahlen ohne rekursive Wiederholung:
Code: Alles auswählen
def number_input(prompt):
while True:
user_input = input(prompt)
try:
return float(user_input)
except ValueError:
print("Es dürfen nur Zahlen eingegeben werden")
if __name__ == "__main__":
number1 = number_input("Gib eine Dezimalzahl ein: ")
number2 = number_input("Gib noch eine Dezimalzahl ein: ")
result = number1 + number2
print(f"Die Summe von {number1:0.2f} und {number2:0.2f} ist {result:0.2f}")