Bedingungen für input setzen - Python

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
dh_humanities
User
Beiträge: 10
Registriert: Donnerstag 18. November 2021, 09:52

Hallo allerseits,

ich stehe momentan auf der Leitung. Wenn ich meinen Code wie unten angebe, dann funktioniert er nur, wenn alle eingegebenen Zahlen 3-stellig sind. Ich möchte jedoch Eingabefehler abfangen, sodass nur ein- und zweistellige Zahlen bis 45 eingegeben werden können.

def validate_tip(user_input):
user_input = list(map(int, input("Choose your lucky numbers: ").split()))
for element in user_input:
if element in range(46):
return user_input
else:
print (None)
validate_tip(1)

Wie könnte ich das lösen? :?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@dh_humanities,

"user_input" enthält alle durch Leerzeichen getrennten Zahlen die der Benutzer eingegeben hat.
Wenn du nur das erste Element im Bereich von 1 bis 45 ausgeben möchtest, must du "element" und nicht "user_input" zurückgeben.

Die Übergabe der 1 an die Funktion ist sinnlos, da das Argument "user_input" durch die Benutzereingabe überschrieben wird.
Soll wirklich nur die ersten passende Zahl oder alle passenden Zahlen zurückgegeben werden. Aktuell hört die Funktion nach der ersten passenden auf.

Falls du doch alle passenden zurückgeben möchtest wäre das eine Lösung:

Code: Alles auswählen

def get_lucky_numbers():
    lucky_numbers = []
    for element in map(int, input("Choose your lucky numbers: ").split()):
        if element in range(46):
            lucky_numbers.append(element)
    return lucky_numbers

lucky_numbers = get_lucky_numbers()
Oder etwas kompakter:

Code: Alles auswählen

lucky_numbers = [
    element
    for element in map(int, input("Choose your lucky numbers: ").split())
    if element in range(46)
]
dh_humanities
User
Beiträge: 10
Registriert: Donnerstag 18. November 2021, 09:52

Ach ja, danke. Das habe ich vergessen zu erwähnen.
Es sollten nur 6 Eingaben möglich sein, die ein-oder zweistellig bis 45 sind. Wie löse ich das mit den 6 Eingaben?
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dh_humanities: Du teilst die Eingabe an Leerzeichen auf und prüfst ob das dann 6 Elemente sind.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
dh_humanities
User
Beiträge: 10
Registriert: Donnerstag 18. November 2021, 09:52

also so?

Code: Alles auswählen

for element in map(int, input("Choose your lucky numbers: ").split()[:6])
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dh_humanities: Jain. Das kommt drauf an ob es in Ordnung ist Eingaben einfach zu ignorieren. Das hätte ich so jetzt nicht aus den bisherigen Beiträgen herausgelesen. Und ich persönlich wäre da auch kein Fan von dem Benutzer nicht um die Ohren zu hauen das er mehr eingegeben hat als er sollte. Vielleicht hat er ja einen Fehler gemacht und dann arbeitet das Programm mit falschen Eingaben weiter, der Benutzer denkt aber es würde andere verwenden.

Das mit dem Leerzeichen war in diesem Fall nicht so einschränkend gemeint. Ich meinte allgemein Leerraum jeglicher Art und Länge zwischen den Eingabeteilen. Da können sonst für den Benutzer verwirrende Probleme auftreten wenn er mal zwei Leerzeichen zwischen zwei Zahlen setzt:

Code: Alles auswählen

In [45]: "a  b".split(" ")                                                      
Out[45]: ['a', '', 'b']

In [46]: "a  b".split()                                                         
Out[46]: ['a', 'b']
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
dh_humanities
User
Beiträge: 10
Registriert: Donnerstag 18. November 2021, 09:52

@__blackjack__: alles klar, danke!
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dh_humanities: Dein bisheriger Code scheint übrigens einfach davon auszugehen, dass das schon Zahlen sein werden und eine Umwandlung in `int()` immer funktioniert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
dh_humanities
User
Beiträge: 10
Registriert: Donnerstag 18. November 2021, 09:52

@__blackjack__: ist mir auch bewusst geworden. Wobei mir auch noch aufgefallen ist, dass der Code von @rogerb (danke übrigens!) nur abgefangen wird, wenn zwei- bzw. dreistellige Zahlen über 45 am Anfang eingegeben werden.

1) funktioniert bei z.B.:
66 1 2 3 4 5

2) wenn ich aber z.B. eingebe:
1 2 3 4 5 66

3) oder:

12 77 901

funktioniert der Code trotzdem. 2 und 3 sollten aber nicht möglich sein. 6 Eingaben müssen es sein und alle Elemente dürfen nur ein-oder zweistellig bis 45 sein.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

dh_humanities hat geschrieben: Donnerstag 9. Dezember 2021, 12:49 @__blackjack__: ist mir auch bewusst geworden. Wobei mir auch noch aufgefallen ist, dass der Code von @rogerb (danke übrigens!) nur abgefangen wird, wenn zwei- bzw. dreistellige Zahlen über 45 am Anfang eingegeben
Nicht ganz sicher was du mit "abgefangen" meinst aber range(46) ist ja recht eindeutig:

Code: Alles auswählen

0 in range(46)
True
1 in range(46)
True
45 in range(46)
True
46 in range(46)
False
Für sechs valide Eingaben sieht es so aus:

Code: Alles auswählen

def get_lucky_numbers():
    lucky_numbers = []
    for element in map(int, input("Choose your lucky numbers: ").split()):
        if element in range(46):
            lucky_numbers.append(element)
    return lucky_numbers[:6]

lucky_numbers = get_lucky_numbers()
print(lucky_numbers)
Wenn du im Ganzen nur 6 Eingaben verarbeiten möchtest, must du es so machen wie __blackjack__ angedeutet hatte.
dh_humanities
User
Beiträge: 10
Registriert: Donnerstag 18. November 2021, 09:52

wie kann ich das in meinem Fall bei folgender Codierung umsetzen:

Code: Alles auswählen

def validate_tip():
    lucky_numbers = []
    user_input = list(map(int, input("Choose your lucky numbers: ").split()))
    for element in user_input:
        if element in range(46):
            lucky_numbers.append(element)
            return ("Your lucky numbers are: {}".format(user_input[:6]))
        else:
            print ("Error: Chosen number not valid. Only numbers between 1 and 45 allowed.")
            return None
validate_tip()
Wenn ich sage

Code: Alles auswählen

user_input[:6]
, funktioniert es nicht. Sorry, aber ich stehe im Moment auf der Leitung...
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@dh_humanities,

dein Konzept passt irgendwie nicht. Ein Problem ist, dass du zunächst alle Eingaben vom Benutzerholst und dann prüfst ob die Eingaben richtig sind. Was soll dann passieren wenn es eine oder mehrere falsche Eingabe gibt? Aktuell wird ja alles verworfen und None zurückgegeben.
Du solltest dir einmal stichpunktartig als Pseudo-Code aufschreiben wie das Programm ablaufen soll.

So könnte man es machen:
Dabei wird aber jede Eingabe einzeln geholt und geprüft:

Code: Alles auswählen

def validate_tip():
    lucky_numbers = []
    while True:
        try:
            user_input = int(input(f"Choose your lucky number {len(lucky_numbers)+1}: "))
        except ValueError:
            print("Only Numbers allowed")
        else:
            if user_input not in range(1, 46):
                print("Only Numbers from 1 to 45 allowed")
            else:
                lucky_numbers.append(user_input)
                if len(lucky_numbers) > 5:
                    return lucky_numbers


print(validate_tip())
Hier ist eine Schwachstelle, dass der Benutzer erst aus der Schleife heraus kommt wenn es 6 valide Eingaben gibt.
Was ist, wenn identische Zahlen eingegeben werden?
Wie gesagt, ein klares Konzept ist nötig.
dh_humanities
User
Beiträge: 10
Registriert: Donnerstag 18. November 2021, 09:52

rogerb hat geschrieben: Donnerstag 9. Dezember 2021, 14:08 Was soll dann passieren wenn es eine oder mehrere falsche Eingabe gibt? Aktuell wird ja alles verworfen und None zurückgegeben.
-> Soll auch so sein, ist nur ein Testcode mit den Grundfunktionen von Python für Anfänger. Kann ich den vorher angegebenen Code nicht irgendwie minimal ändern, sodass mir Punkt 2 und 3 (siehe vorherige Antwort) nicht passieren?
Hier ist eine Schwachstelle, dass der Benutzer erst aus der Schleife heraus kommt wenn es 6 valide Eingaben gibt.
Was ist, wenn identische Zahlen eingegeben werden?
Wie gesagt, ein klares Konzept ist nötig.
-> Jede Zahl kann nur einmal eingegeben werden.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Kann ich den vorher angegebenen Code nicht irgendwie minimal ändern, sodass mir Punkt 2 und 3 (siehe vorherige Antwort) nicht passieren?
Ja, das geht, du hast aber den gleichen Fehler wieder gemacht, den ich dir vorher schon angemerkt hatte.
Jede Zahl kann nur einmal eingegeben werden.
Das ist aktuell nicht umgesetzt. Man kann die Liste der Eingaben aber in ein Set umwandeln, dabei werden nur mehrfach vorkommende Zahlen zusammengefasst
dh_humanities
User
Beiträge: 10
Registriert: Donnerstag 18. November 2021, 09:52

rogerb hat geschrieben: Donnerstag 9. Dezember 2021, 14:32
Kann ich den vorher angegebenen Code nicht irgendwie minimal ändern, sodass mir Punkt 2 und 3 (siehe vorherige Antwort) nicht passieren?
Ja, das geht, du hast aber den gleichen Fehler wieder gemacht, den ich dir vorher schon angemerkt hatte.
Jede Zahl kann nur einmal eingegeben werden.
Das ist aktuell nicht umgesetzt. Man kann die Liste der Eingaben aber in ein Set umwandeln, dabei werden nur mehrfach vorkommende Zahlen zusammengefasst
Licht ist aufgegangen, danke! :!:
Antworten