Exception und int mit input einlesen

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
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Hallo an alle,

ich bin IT Systemkaufmann und habe bisher eigentlich immer nur mit PHP gearbeitet, dazu ganz rudimentär JAVA, letzteres ist aber schon ein Weilchen her. Insgesamt "programmiere" ich nur hobbymäßig....

An einem Punkt komme ich nicht weiter und ich komme einfach nicht auf den Fehler....

Es soll ein ganz einfaches Zahlenraten auf Commandline Ebene ergeben, einen funktionierenden Code, der nur die Eingabe des Datentyps int erlaubt, habe ich:

while True:

Eingabe = input ("Bitte gib eine Ganzzahl ein....")

try:
EingabeZ = int(Eingabe)
#raise ValueError("Non numeric value")

# gibt einen TEXT und die eingegebene Zahl nochmal auf dem Bildschirm aus
Text="Deine eingegebene Zahl ist: "
print(Text, EingabeZ)

if ( ZufallsZ == EingabeZ ): print ("Glueckwunsch! Du hast Die Zufallszahl erraten!")

else: print ("Schade, die Zufallszahl war",ZufallsZ)

break

except :
print ('Du hast keine Ganzzahl eingegeben!')
continue
Jetzt würde ich gerne aber bereits int einlesen, nur das funktioniert

while True:

neueEingabe = int(input("Bitte gib eine Ganzzahl ein"))

try:

print(neueEingabe)

break

except: print ('Du hast keine Ganzzahl eingegeben!')
#continue
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Niemals nackte except-Klauseln benutzen, wenn man nicht weiss, was man macht. Fehler faengt man immer so spezifisch ab, wie es geht. Also in diesem Fall ein ValueError. Und Code bitte mit code-tags posten, dass ist der </>-Knopf im vollstaendigen Editor.

Zu guter letzt zu deinem Problem (ungetestet):

Code: Alles auswählen

while True:
    try:
        zahl = int(input("Bitte Ganzzahl eingeben"))
        break
    except ValueError:
        print("Fehlerhafte Eingabe")
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Vielen Dank erstmal.

Wie eingangs erwähnt bin ich in Python kein Profi, im Programmieren auch nicht, code ab und an mal etwas, aber nicht Python.

Zu Exceptions habe ich ein paar Dinge gelesen, manches funktioniert, anderes nicht (auch abhängig von der Python Version)

Den Code habe ich probiert und erhalte dieselbe Fehlermeldung:

Code: Alles auswählen

invalid literal for int() with base 10: 'x'
Genau um diesen Fehler geht es.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kann leider nicht sein, denn ich habe jetzt gerade die Moeglichkeit gehabt, das mal schnell auszuprobieren - meinen Code - und er tut exakt das, was er soll: jede Eingabe, die nicht in eine Ganzzahl ueberfuehrt werden kann, abzulehnen, mit Ausgabe der Fehlermeldung, und dann wieder um Eingabe zu bitten.

Und allgemein gilt: Geschichten ueber was wann mal wie wo nicht oder doch funktioniert hat, sind schoen, aber leider nur fuer Lagerfeuer-Abende geeignet. Bitte zeige konkreten Code und konkrete, dazu passende Fehlermeldung. Denn sonst kann man dazu nur mit den Achseln zucken.

Ich habe meinen Code mal aesthetisch etwas ueberarbeitet:

Code: Alles auswählen

while True:
    try:
        zahl = int(input("Bitte Ganzzahl eingeben: "))
        break
    except ValueError:
        print("Fehlerhafte Eingabe")

print("Eingegebene Zahl:", zahl)
Und so sieht das in der Benutzung aus:

Code: Alles auswählen

15:34 $ python3 /tmp/test.py 
Bitte Ganzzahl eingeben: abced
Fehlerhafte Eingabe
Bitte Ganzzahl eingeben: 10
Eingegebene Zahl: 10
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Gerne, ich nutze einen online Compiler, ich poste den Screenshot

Bild

http://kalenderfamily.de/pubtemp/valuerror.png
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst schon meinen Code nehmen, nicht irgendetwas selbst gemachtes, in dem der Code, der die Ausnahme ausloest (naemlich das int(...)) *VOR* der Ausnahmebehandlung steht. Dann funktioniert also sehr wohl, nur hast du halt nicht das ausprobiert, was ich geliefert habe 🤷‍♂️
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Entschuldigung! Geht, ja, ich werde es mir auf jeden Fall nochmal genauer ansehen und meinen Code überarbeiten

Das mit den Blöcken ist auch so ne Umstellung....ich finde es mit { } einfach doch übersichtlicher...

Danke nochmal!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hier findest du also uebersichtlicher?

Code: Alles auswählen

while (True) { try { zahl = int(input("Bitte Ganzzahl eingeben: ")); break } except(ValueError) { print("Fehlerhafte Eingabe") } } ; print("Eingegebene Zahl:", zahl)
Kann ich mir beim besten Willen nicht vorstellen. Jeder der in einer solchen Sprache programmiert, benutzt auch Einrueckungen. C, C++, Java, JavaScript, ALLE ruecken ein. Der Compiler braucht das nicht, aber der Mensch. Alles was Python macht ist zu sagen "dann wird's eben semantisch wichtig". Was in der Zwischenzeit diverse Sprachen nachmachen, weil der Mensch eben die Einrueckungen eh braucht.
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Man muss ja nicht übertreiben, aber:

Code: Alles auswählen

while (True) { 

                          try { zahl = int(input("Bitte Ganzzahl eingeben: ")); break 
                          
                          } 

except (ValueError)  {  print("Fehlerhafte Eingabe") }

else {p print("Eingegebene Zahl:", zahl)}
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@kalenderfamily: Schönes Beispiel dafür, warum die Blockkennzeichnung durch Klammern fehleranfällig ist, wenn man nicht ordentlich einrückt: Wo ist denn die schließende Klammer für die Schleife? Auch mit Klammern ist korrente Einrückung super wichtig, um die Übersicht zu behalten. Und wenn man das ordentlich tut, ist man genau dort, wo man auch bei Python ist - nur mit unnützen Klammern.
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Dann habe ich eine Klammer vergessen, finde ich persönlich jetzt nicht so schlimm, auf jeden Fall sieht man das offensichtlich ja auf den ersten Blick?

Vielen Dank für das Beispiel!

Wenn man falsch einrückt sieht man das im Standardnotepad eventuell nicht direkt?

Wer sagt eigentlich, dass man trotz Klammern nicht einrückt? Wie gleich Extreme - wie der Code oben - aufgefahren werden, mir unverständlich.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

kalenderfamily hat geschrieben: Freitag 18. Juni 2021, 19:11 Wer sagt eigentlich, dass man trotz Klammern nicht einrückt? Wie gleich Extreme - wie der Code oben - aufgefahren werden, mir unverständlich.
Schau dir mal das hier an: https://dwheeler.com/essays/apple-goto-fail.html

Eine der vorgeschlagenen Lösungen ist das Verbot falscher Einrückungen. Also das Gebot richtiger Einrückungen. Wozu dann aber überhaupt noch Klammern? Kurz gesagt: Mit Python-artigen Einrückungsregeln wär das nicht passiert.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@kalenderfamily: Naja, du fragst, wer sagt, dass man Code mit Klammern nicht ordentlich einrücken kann und zeigst ja selbst, dass man es gerne nicht tut.
Und wie gesagt: wenn man eh vernünftig einrückt, sind die Klammern sowieso unnötig.
Benutzeravatar
hyle
User
Beiträge: 96
Registriert: Sonntag 22. Dezember 2019, 23:19
Wohnort: Leipzig

@kalenderfamily Als Lehrer solltest Du Vorbild sein und es selber *richtig* machen, bzw. den Schülern zeigen. ;) Ich glaube das ist ein guter Zeitpunkt für den Link zu Style Guide for Python Code (PEP8).
Alles was wir sind ist Sand im Wind Hoschi.
Antworten