Bedingung in for Schleife

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
Ooldman24
User
Beiträge: 16
Registriert: Samstag 11. August 2018, 14:09

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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)))
Ooldman24
User
Beiträge: 16
Registriert: Samstag 11. August 2018, 14:09

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]
]

Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Ooldman24
User
Beiträge: 16
Registriert: Samstag 11. August 2018, 14:09

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 :mrgreen:

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?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Ooldman24
User
Beiträge: 16
Registriert: Samstag 11. August 2018, 14:09

@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!
Ooldman24
User
Beiträge: 16
Registriert: Samstag 11. August 2018, 14:09

Code: Alles auswählen

            choice = int(raw_input("Ihre Wahl?")) -1
Das war es :-)

Danke euch für die schnelle Hilfe :)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ooldman24: `raw_input()` gibt es in Python 3 nicht mehr, also benutzt Du Python 2.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Ooldman24
User
Beiträge: 16
Registriert: Samstag 11. August 2018, 14:09

@__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?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Ooldman24
User
Beiträge: 16
Registriert: Samstag 11. August 2018, 14:09

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
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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`.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Ooldman24
User
Beiträge: 16
Registriert: Samstag 11. August 2018, 14:09

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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

Code: Alles auswählen

#!/usr/bin/env python3
print("Hallo!)
gibt der Datei Ausführrechte und ruft es per skript.py auf.
Antworten