Frage zu Datentypen Fehler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Unxendlicher
User
Beiträge: 15
Registriert: Freitag 28. Januar 2022, 20:18

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 :)
gerr
User
Beiträge: 4
Registriert: Dienstag 25. Januar 2022, 19:14

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
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gerr: Rekursion ist kein Ersatz für Schleifen. Das funktioniert nicht wirklich bei Programmiersprachen die keine Endrekursion weg optimieren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Unxendlicher
User
Beiträge: 15
Registriert: Freitag 28. Januar 2022, 20:18

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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}")
Antworten