Doppelabsicherung bei Eingabe

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.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Hallo,

ich habe hier verhindert, dass anstelle einer Zahl z.B. Buchstaben eingegeben werden. Das funktioniert.

Code: Alles auswählen

while True:
    try:    
        tore_a = int(input("Gebe die Tore der Heimmannschaft ein:"))
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
Hier möchte ich 2 Eingaben verhindern:
- dass anstelle einer Zahl z.B. Buchstaben eingegeben werden
und
- dass die Zahl kleiner als 0 und größer als die MANNSCHAFTSANZAHL ist.

Code: Alles auswählen

while True:
    try:
        i = int(input("Gebe die Ziffer für die Heimmannschaft ein:"))
        i < 0 and i >= MANNSCHAFTSANZAHL
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
Leider funktioniert es nicht. Wer kann mir hier weiterhelfen?

Gruß

Bill
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum sollte da etwas anderes passieren, als in der ersten Version? Das erzeugen eines Wahrheitswertes, mit dem man dann nichts macht, ändert am Ergebnis nichts.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Es tut mir leid. Ich verstehe es nicht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du einfach einen Vergleich hinschreibst

10 < 100

dann hat das keine Auswirkung. Das rechnet einfach den Wahrheitswert aus, und weil mit dem nix passiert, laeuft der Interpreter halt weiter. Wenn du was darauf basierend etwas enscheiden willst, dann musst du schon eine if-Anweisung nutzen.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Danke für die Info. Meine neue und auch wieder falsche Version sieht so aus:

Code: Alles auswählen

while True:
    try:
        i = int(input("Gebe die Ziffer für die Heimmannschaft ein:"))
        if i < 0 and i >= MANNSCHAFTSANZAHL: 
        break
    except:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast einen Einrueckungsfehler. Wofuer sind Einrueckungen in Python wichtig?
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Die Einrückungen erfolgen nach Doppelpunkten. Sie muss mindestens 3 Zeichen betragen. Wenn die Einrückung auf 3 Zeichen eingesellt ist, muss sie auch 3 und kein vielfaches davon betragen und daraf auch nicht z.B. 4,5,7,8,10 usw.Zeichen betragen.
Einfachere Sachen, wie dies hier sind mir bekannt. Dass ich "alles" darüber weiß, will ich aber nicht behaupten.

Den Einrückungsfehler hätte ich auch selbst bemerken MÜSSEN. Habe "break" jetzt eingerückt.

Jetzt bin ich leider in einer Dauerschleife:
Gebe die Ziffer für die Heimmannschaft ein:1
Gebe die Ziffer für die Heimmannschaft ein:u
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Ziffer für die Heimmannschaft ein:0
Gebe die Ziffer für die Heimmannschaft ein:2
Gebe die Ziffer für die Heimmannschaft ein:1
Gebe die Ziffer für die Heimmannschaft ein:3
Gebe die Ziffer für die Heimmannschaft ein:4
Gebe die Ziffer für die Heimmannschaft ein:

Leider weiß ich wieder mal nicht, warum.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Ich denke, dass die Doppelabfrage "ungefähr" so aussehen müsste:

Code: Alles auswählen

while True:
    try:
        i = int(input("Gebe die Ziffer für die Heimmannschaft ein:"))
        if i < 0 and i >= MANNSCHAFTSANZAHL and type(i)!=(int):
            break
    except:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Einrueckungen 3 Zeichen tief sein sollen ist nicht wahr. Sie sollen 4 Leerzeichen tief sein.

Und warum machst du da so eine Typpruefung? Aus der Zeile davor geht doch hervor, dass es sich wenn um eine Ganzzahl handeln muss, du rufst ja int(...) um input auf. Wenn das *keine* Ganzzahl ist, dann fliegt eine Exception. Die faengst du ja ab. Allerdings zu breit. Du solltest nur den ValueError abfangen.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Das Einrueckungen 3 Zeichen tief sein sollen ist nicht wahr. Sie sollen 4 Leerzeichen tief sein.
Sorry!

Und warum machst du da so eine Typpruefung?
Ich will verhindern, dass Buchstaben eingegeben und von Python angenommen werden.
Aus der Zeile davor geht doch hervor, dass es sich wenn um eine Ganzzahl handeln muss, du rufst ja int(...) um input auf. Wenn das *keine* Ganzzahl ist, dann fliegt eine Exception. Die faengst du ja ab. Allerdings zu breit. Du solltest nur den ValueError abfangen.

Habe den Code jetzt so geändert:

Code: Alles auswählen

while True:
    try:
        i = int(input("Gebe die Ziffer für die Heimmannschaft ein:"))
        if (i < 0 and i >= MANNSCHAFTSANZAHL):
            break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
Der Bildschirmausdruck ist folgender:

Gebe die Ziffer für die Heimmannschaft ein:r
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Ziffer für die Heimmannschaft ein:1
Gebe die Ziffer für die Heimmannschaft ein:o
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Ziffer für die Heimmannschaft ein:2
Gebe die Ziffer für die Heimmannschaft ein:1
Gebe die Ziffer für die Heimmannschaft ein:0
Gebe die Ziffer für die Heimmannschaft ein:t
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Ziffer für die Heimmannschaft ein:

Wenn ich einen Buchstaben eingebe kommt "Ups....."
Wenn ich eine Zahl ab 0 eingebe bleibt Python in der Zeile.
Bin immer noch in so einer Art Dauerschleife. Ich weiß wirklich nicht warum das so ist.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na weil du das so programmiert hast. Und das ist ja auch sinnvoll, 0 ist ja ein gueltiger Wert, das ist ja die erste Mannschaft.

Du musst schon einen Wert eingeben, der deine Bedingung erfuellt. Also entweder etwas kleiner 0, oder etwas groesser als MANNSCHAFTSANZAHL.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Ich befürchte, dass ich etwas nicht verstanden habe.

Gebe die Ziffer für die Heimmannschaft ein:u
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Ziffer für die Heimmannschaft ein:0
Gebe die Ziffer für die Heimmannschaft ein:1
Gebe die Ziffer für die Heimmannschaft ein:2
Gebe die Ziffer für die Heimmannschaft ein:3
Gebe die Ziffer für die Heimmannschaft ein:-1
Gebe die Ziffer für die Heimmannschaft ein:

Wenn ich einen Buchstaben u eingebe fliegt die Exception. Das ist ja richtig.
Aber Python unterscheidet bei i nichts. Habe - bis 3 eingegeben. Warum unterscheidet Python hier nicht?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah, verzeih. Mein Fehler. Du benutzt den falschen Operator. Du willst abbrechen, wenn die Zahl kleiner 0 ist ODER groesser N. Das sie kleiner 0 UND groesser N ist, kann ja nicht vorkommen. Du musst also or benutzen.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

__deets__ hat geschrieben: Samstag 11. April 2020, 19:52 Ah, verzeih. Schon in Odnung. Ist nicht schlimm. Mein Fehler. Du benutzt den falschen Operator. Du willst abbrechen, wenn die Zahl kleiner 0 ist ODER groesser N. Das sie kleiner 0 UND groesser N ist, kann ja nicht vorkommen. Du musst also or benutzen.
Den falschen Operator hätte ich selbst bemerken müssen. Tut mir leid.

neuer Code:

Code: Alles auswählen

while True:
    try:
        i = int(input("Gebe die Ziffer für die Heimmannschaft ein:"))
        if (i < 0 or i >= MANNSCHAFTSANZAHL):
            break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
Es passt aber trotzdem noch etwas nicht.
Bildschirmausdruck:

Gebe die Ziffer für die Heimmannschaft ein:r
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Ziffer für die Heimmannschaft ein:7
Gebe die Ziffer für die Auswärtsmannschaft ein:7

Bei Eingabe der Ziffer 7, die ja außerhalb des Bereiches liegt, sprint Python in die nächste Zeile Gebe die Ziffer für die Auswärtsmannschaft ein:
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Dass die Einrückung falsch war, hättest Du gleich an der Fehlermeldung sehen können, und hättest nicht nachfragen müssen. Nackte Excepts sind übrigens schlecht, weil Du so Programmierfehler nicht entdecken kannst, fange immer nur konkrete Exceptions ab, hier nur ValueError.
Und dann kannst Du Dich noch fragen, wann eine Zahl sowohl kleiner als 0 und größer als 4 ist.
Eine Mannschaft wird wahrscheinlich nicht durch eine Ziffer, sondern durch eine Nummer repräsentiert, und Nummern fangen normalerweise für die meisten Menschen bei 1 an.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Sirius3 hat geschrieben: Samstag 11. April 2020, 20:05 Dass die Einrückung falsch war, hättest Du gleich an der Fehlermeldung sehen können, und hättest nicht nachfragen müssen. Nackte Excepts sind übrigens schlecht, weil Du so Programmierfehler nicht entdecken kannst, fange immer nur konkrete Exceptions ab, hier nur ValueError.
Und dann kannst Du Dich noch fragen, wann eine Zahl sowohl kleiner als 0 und größer als 4 ist. Fehler ist inzwischen behoben.
Eine Mannschaft wird wahrscheinlich nicht durch eine Ziffer, sondern durch eine Nummer repräsentiert, und Nummern fangen normalerweise für die meisten Menschen bei 1 an. Werde künftig von Nummern sprechen/schreiben. Sorry
Danke für die Info. :)
Muss erst mal googlen, um herauszufinden, was nackte Exceptions und ihr Unterschied zu konkrete Exceptions ist. Werde mich hierzu in einigen Tagen per Post melden.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Vielen Dank für die konkrete Hilfe.
Ich wollte NIEMANDEM mit meinem Post von gestern zu nahe treten. Entschuldigt bitte
Mache für heute Schluss
Bill
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Habe leider nichts verständliches über nackte excepts gefunden

In der neusten Version habe ich Ziffer durch Kennzahl ersetzt. Außerdem habe ich die Anzahl der Mannschaften auf 4 geändert.

Bei der Doppelabfrage ist mein aktueller Code:

Code: Alles auswählen

while True:
    try:
        i = int(input("Gebe die Kennzahl für die Heimmannschaft ein:"))
        if (i < 0 or i >= MANNSCHAFTSANZAHL):
            break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")

Ich habe gerade festgestellt, dass die Exception geworfen wird, wenn ein Buchstabe eingegeben wird. Das ist auch wie gewollt.
Gebe ich die Zahlen 1, 2 oder 3 ein, springt Python an den Anfang der Zeile, wirft aber keine Exception.
Gebe ich 4 ein setzt Python das Programm fort.

Bildschirmausdruck

Gebe die Kennzahl für die Heimmannschaft ein:g
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Kennzahl für die Heimmannschaft ein:g
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Kennzahl für die Heimmannschaft ein:h
Ups! Das war keine gültige Zahl. Versuche es noch einmal...
Gebe die Kennzahl für die Heimmannschaft ein:1
Gebe die Kennzahl für die Heimmannschaft ein:2
Gebe die Kennzahl für die Heimmannschaft ein:3
Gebe die Kennzahl für die Heimmannschaft ein:4
Gebe die Ziffer für die Auswärtsmannschaft ein:

Könnte mir hier bitte jemand weiterhelfen?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Bedingung ist ja immer noch falsch herum.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Dann verstehe ich den Ablauf des Programmes noch nicht. Ich verstehe das so: Wenn i kleiner 0 oder größer Mannschaftsanzal ist, soll Python unterbrechen und zu while True zurückspringen.

Diese Vermutung ist wahscheinlich falsch, oder?
Antworten