Seite 1 von 1
Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 13:28
von Ooldman24
Hey Ihr lieben, ich melde mich nach langer Zeit mal wieder
Ich bin gerade am verzweifeln. Ich möchte ein textbasiertes Menu schreiben. Dabei habe ich das Problem, dass wenn ich keine Zahl, sondern Enter oder einen Buchstaben eingebe das Programm abstürzt.
ich habe es schon mit:
elif type(choice) != int:
versucht. Allerdings hat auch das nicht geklappt.
Hier mal der Code:
Code: Alles auswählen
#GastroPlan Menu
import sys
import subprocess
import addfood
import showfood
def quit():
sys.exit(0)
def handle_menu(menu):
while True:
for index, item in enumerate(menu, 1):
print ("{} {}".format(index, item[0]))
choice = int(input("Ihre Wahl?")) -1
if 0 <= choice < len(menu):
menu[choice][1]()
elif type(choice) != int:
print("Bitte nur Zahlen im Bereich 1- {} eingeben".format(len(menu)))
menu = [
["Speisen Hinzufuegen:", addfood.add_Food],
["Speisen Uebersicht", showfood.show_Food],
["Exit", quit]
]
Danke euch schon im Voraus für eure Hilfe!
LG
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 13:48
von Sirius3
Das macht man indem man die auftretende Exception abfängt und behandelt (Das Programm stützt ja nicht ab, sondern beendet sich, weil die Exception nicht behandelt wurde).
Code: Alles auswählen
try:
choice = int(input("Ihre Wahl?")) - 1
except ValueError:
choice = -1
if 0 <= choice < len(menu):
menu[choice][1]()
else:
print("Bitte nur Zahlen im Bereich 1- {} eingeben".format(len(menu)))
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 14:07
von Ooldman24
Vielen dank für deine Hilfe.
Das hatte ich auch schon versucht. Allerdings hatte wusste ich nicht wohin mit dem Try xD
Ich bekomme leider diesen Fehler:
Code: Alles auswählen
line 17
choice = int(input("Ihre Wahl?")) -1
^
IndentationError: expected an indented block
Habe den Code so geändert:
Code: Alles auswählen
#GastroPlan Menu
import sys
import subprocess
import addfood
import showfood
def quit():
sys.exit(0)
def handle_menu(menu):
while True:
for index, item in enumerate(menu, 1):
print ("{} {}".format(index, item[0]))
try:
choice = int(input("Ihre Wahl?")) -1
except ValueError:
choice = -1
if 0 <= choice < len(menu):
menu[choice][1]()
elif type(choice) != int:
print("Bitte nur Zahlen im Bereich 1- {} eingeben".format(len(menu)))
menu = [
["Speisen Hinzufuegen:", addfood.add_Food],
["Speisen Uebersicht", showfood.show_Food],
["Exit", quit]
]
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 14:20
von __blackjack__
@Ooldman24: Einrückung hat eine Bedeutung in Python.
Wozu ist `quit()` gut? Da wo das verwendet wird, könntest Du einfach `sys.exit()` verwenden.
`add_Food()` und `show_Food()` entsprechen nicht der Namenskonvention: klein_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Siehe
Style Guide for Python Code.
Und das sieht nach einer Funktion pro Modul und globalem Zustand aus‽ Das wäre gar nicht gut.
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 14:28
von Ooldman24
Oh je... habe es gerade gesehen das die Einrückung schuld war.
Ich dachte eben ich deklariere das quit einfach. Hast du natürlich recht völlig recht. Ich habe mich insgesamt sicher weniger als 20 Stunden mit Python auseinander gesetzt und bin noch am dazu Lernen
Ich bekomme aber immer noch diesen Fehler wenn ich ein Zeichen eingebe das keine Zahl ist:
Code: Alles auswählen
line 17, in handle_menu
choice = int(input("Ihre Wahl?")) -1
File "<string>", line 1, in <module>
NameError: name 'ff' is not defined
Das bedeutet doch das die Try Bedingung nichts gebracht hat und er (der Interpreter) immer noch versucht über die das Tuple zu interieren, dabei allerdings die Bedingung nicht findet. Sprich er überspringt die Try-Except Bedingung oder?
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 14:33
von Sirius3
@Ooldman24: Du benutzt offensichtlich Python2, was man nicht mehr benutzen sollte, wenn man mit Python anfängt, weil es veraltet ist. Dann ist aber print keine Funktion und die Klammern irritierend. Dort heißt input raw_input, aber der dringende Rat ist, Python3 zu benutzen.
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 14:43
von Ooldman24
@Siruis3
Ich benutze eigentlich schon das aktuellste Python, ich glaube nur das Tutorial war auf Python2 basiert xD
Kann ich den Code im ganzen nutzen und etwas modifizieren oder sollte ich einen neuen Lösungsansatz entwerfen?
Danke dir!
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 15:05
von Ooldman24
Das war es
Danke euch für die schnelle Hilfe
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 15:08
von __blackjack__
@Ooldman24: `raw_input()` gibt es in Python 3 nicht mehr, also benutzt Du Python 2.
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 15:28
von Ooldman24
@__Blackjack__
Meine Pythonversion ist 3.7
schreibe ich es ohne raw_input also nur:
choice = input("Ihre Wahl?") -1
Will es wieder nicht klappen.
Es muss doch eine Konvention geben die mit Python 3.6 funktioniert ohne dabei auf ein Objekt von Python2 zurück zugreifen oder?
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 15:39
von Sirius3
@Ooldman24: Python sagt ja nicht nur, dass es nicht klappt, sondern auch warum. Nämlich weil man von einem String keine Zahl abziehen kann. Warum hast Du jetzt die Umwandlung in `int` weggelassen?
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 15:42
von Ooldman24
Vormals hatte ich es so getestet:
choice = int(input("Ihre Wahl?")) -1
Das Ergebnis war das gleiche. Gebe ich eine falsche Zahl ein werde ich gebeten eine Valide einzugeben. Gebe ich Enter oder einen Buchstaben ein wird das Programm beendet
Re: Bedingung in for Schleife
Verfasst: Dienstag 22. Januar 2019, 16:38
von __blackjack__
@Ooldman24: Wenn `raw_input()` funktioniert dann benutzt Du Python 2 und nicht Python 3. `raw_input()` gibt es in Python 3 nicht. Würdest Du Python 3 verwenden, dann bekämst Du an der Stelle einen `NameError`.
Re: Bedingung in for Schleife
Verfasst: Mittwoch 23. Januar 2019, 01:08
von snafu
Ooldman24 hat geschrieben: ↑Dienstag 22. Januar 2019, 15:28
Meine Pythonversion ist 3.7
(...)
Es muss doch eine Konvention geben die mit Python 3.6 funktioniert ohne dabei auf ein Objekt von Python2 zurück zugreifen oder?
So kann man dir schlecht helfen. Du schreibst von
raw_input(), benutzt aber angeblich Python 3.7 und zum Schluss geht es wohl um Version 3.6 in Verbindung mit Python 2 (diesen Hybriden gibt es natürlich nicht). Bitte mal die Ausgabe von
sys.version_info posten und zwar aus der Umgebung heraus, von der du deine Python-Programme aufrufst. Oft ist Anfängern nicht bewusst, dass sie in ihrer IDE eine andere Python-Version verwenden als sie denken.
Re: Bedingung in for Schleife
Verfasst: Mittwoch 23. Januar 2019, 12:59
von Ooldman24
Naja, beides ist wohl richtig.
Es ist Python 3.7 Installiert. Meine Shell (MacOS) gibt mir allerdings 2.7 aus.
Ich mache es jetzt so dass ich in der shell die Programme mit python3 xxx.py aufrufe.
Re: Bedingung in for Schleife
Verfasst: Mittwoch 23. Januar 2019, 17:08
von Sirius3
Das ist auch das normale Verhalten: python ruft Python2 auf und python3 Python3.
Für ein Skript schreibt man deshalb auch in die erste Zeile
gibt der Datei Ausführrechte und ruft es per skript.py auf.