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?
Bedingungen für input setzen - Python
@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:
Oder etwas kompakter:
"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()
Code: Alles auswählen
lucky_numbers = [
element
for element in map(int, input("Choose your lucky numbers: ").split())
if element in range(46)
]
-
- 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?
Es sollten nur 6 Eingaben möglich sein, die ein-oder zweistellig bis 45 sind. Wie löse ich das mit den 6 Eingaben?
- __blackjack__
- User
- Beiträge: 13079
- 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
-
- 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])
- __blackjack__
- User
- Beiträge: 13079
- 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:
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
-
- User
- Beiträge: 10
- Registriert: Donnerstag 18. November 2021, 09:52
@__blackjack__: alles klar, danke!
- __blackjack__
- User
- Beiträge: 13079
- 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
-
- 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.
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.
Nicht ganz sicher was du mit "abgefangen" meinst aber range(46) ist ja recht eindeutig: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
Code: Alles auswählen
0 in range(46)
True
1 in range(46)
True
45 in range(46)
True
46 in range(46)
False
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)
-
- User
- Beiträge: 10
- Registriert: Donnerstag 18. November 2021, 09:52
wie kann ich das in meinem Fall bei folgender Codierung umsetzen:
Wenn ich sage , funktioniert es nicht. Sorry, aber ich stehe im Moment auf der Leitung...
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()
Code: Alles auswählen
user_input[:6]
@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:
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.
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())
Was ist, wenn identische Zahlen eingegeben werden?
Wie gesagt, ein klares Konzept ist nötig.
-
- User
- Beiträge: 10
- Registriert: Donnerstag 18. November 2021, 09:52
-> 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?
-> Jede Zahl kann nur einmal eingegeben werden.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.
Ja, das geht, du hast aber den gleichen Fehler wieder gemacht, den ich dir vorher schon angemerkt hatte.Kann ich den vorher angegebenen Code nicht irgendwie minimal ändern, sodass mir Punkt 2 und 3 (siehe vorherige Antwort) nicht passieren?
Das ist aktuell nicht umgesetzt. Man kann die Liste der Eingaben aber in ein Set umwandeln, dabei werden nur mehrfach vorkommende Zahlen zusammengefasstJede Zahl kann nur einmal eingegeben werden.
-
- User
- Beiträge: 10
- Registriert: Donnerstag 18. November 2021, 09:52
Licht ist aufgegangen, danke!rogerb hat geschrieben: ↑Donnerstag 9. Dezember 2021, 14:32Ja, das geht, du hast aber den gleichen Fehler wieder gemacht, den ich dir vorher schon angemerkt hatte.Kann ich den vorher angegebenen Code nicht irgendwie minimal ändern, sodass mir Punkt 2 und 3 (siehe vorherige Antwort) nicht passieren?
Das ist aktuell nicht umgesetzt. Man kann die Liste der Eingaben aber in ein Set umwandeln, dabei werden nur mehrfach vorkommende Zahlen zusammengefasstJede Zahl kann nur einmal eingegeben werden.