Python 3 "Else" nach wahrer "If" Aussage ausgeführt

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
LucasTrever
User
Beiträge: 5
Registriert: Donnerstag 11. Dezember 2014, 18:12

Ich "arbeite" an einem kleinen Spiel um wieder ein wenig an den Grundsyntax heranzukommen, habe aber folgendes Problem...

Code: Alles auswählen

def mainmenu():

    print("Welcome to TamrielPP")
    print("")
    print("Start game: S")
    print("Exit: E")

    vcontrol = input("")

    if (vcontrol == ("s" or "S")):
        startgame()
    if (vcontrol == ("e" or "E")):
        exit
    else:
        print ("Sorry, this input could not be found, please try again")
        mainmenu()

def startgame():

    loadsaves()

def loadsaves():
    
    startnewgame()

def startnewgame():
    
    print("Done")

mainmenu()
Nachdem das If Statement in Zeile 10 ausgeführt wird, wird auch das Else Statement in Zeile 14 ausgeführt, was nach der wahren If Aussage ja eigentlich nicht passieren dürfte...
Ich entschuldige mich, wenn der Fehler offensichtlich ist, ich habe den Code gestern Abend geschrieben und heute morgen noch eine Stunde dran herumgehangen, was bei diesem enorm kurzen Stück schon beachtlich viel ist...

Danke und lg,
Lucas
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Was ja auch völlig richtig ist.

In Zeile 10 ist If-Statement, und das ist in deinem Fallbeispiel nach Auswretung wahr.
In Zeile 12 ist ein, davön völlig unabhängiges, If-Statement. Das ist unwahr, also wird dessen else-Block ausgeführt.

Hier ein Link auf die Dokumentation, das erste Beispiel sollte dir die Antwort geben.

Edit:
Deine If-Bedingung funktioniert so nicht.

Code: Alles auswählen

>>> ("s" or "S")
's'
>>> "S" == ("s" or "S")
False
>>> "s" == ("s" or "S")
True
Verwende stattdessen den "in"-Operator um zu prüfen ob die gegebene Zeichenkette in einer Liste von Zeichenketten enthalten ist.

Oder du wandelst die Eingabe gleich so, dass du gar nicht gegen eine Liste prüfen musst. Wenn die Eingabe automatisch in Großbuchstaben umgewandelt wird. z.B..
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Böser Fehler :lol:

Dieser Code teil:

Code: Alles auswählen

if (vcontrol == ("s" or "S")):
    startgame()
if (vcontrol == ("e" or "E")):
    exit
else:
    print ("Sorry, this input could not be found, please try again")
    mainmenu()
Kann man auch so formatieren:

Code: Alles auswählen

if (vcontrol == ("s" or "S")):
    startgame()

if (vcontrol == ("e" or "E")):
    exit
else:
    print ("Sorry, this input could not be found, please try again")
    mainmenu()
Sind also zwei unabhängige If-Blöcke :wink:

Was wohl gemeint war ist das:

Code: Alles auswählen

if (vcontrol == ("s" or "S")):
    startgame()
elif (vcontrol == ("e" or "E")):
    exit
else:
    print ("Sorry, this input could not be found, please try again")
    mainmenu()
:mrgreen:

(aber ich würde auch "in" verwenden bzw. .lower() nutzten)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@LucasTrever: or ist eine logische Verknüpfung und kein umgangssprachliches Oder. Ohne die überflüssigen Klammern müßte es also so aussehen:

Code: Alles auswählen

if vcontrol == 's' or vcontrol == 'S':
Zeile 13: Funktionen muß man Aufrufen, nicht nur Referenzieren: exit()
Zeile 16: Rekursive Aufrufe sind kein Schleifenersatz. Benutze ein "while True:" in deinem mainmenu.
LucasTrever
User
Beiträge: 5
Registriert: Donnerstag 11. Dezember 2014, 18:12

@Alle...
Erstmal danke an alle, darauf hätte ich wahrscheinlich auch kommen können, wenn ich mich nicht in den zeileninternen Syntax verbissen hätte... Daraus rührten übrigens auch die überflüssigen Klammern in den Abfragen her. Bedanken kann ich mich allerdings für den Tipp mit dem "In"-Operator, wobei ich es, natürlich nur bei einem solch kurzen Abschnitt, für übersichtlicher halte eine Abfrage durch "Else" auszuführen, so würde ich diesen Teil gerne beibehalten. Falls das ein zu großes Stil-Verbrechen ist, weißt mich doch bitte noch einmal in die Schranken :lol:

Ansonsten, noch einmal danke und lg,
Lucas
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Zeig wie du es löst.
BlackJack

@LucasTrever: Zum Ausgangscode: Dieser verkettete Aufruf von den Funktionen ist nicht gut. Wenn das nacheinander ausgeführt werden soll, dann sollte man die Funktionen nacheinander aufrufen und nicht eine die jeweils nächste aufrufen lassen. Sonst lassen sich Funktionen nicht einzeln testen oder wiederverwenden, weil die immer gleich einen ganzen Rattenschwanz an anderen Funktionen aufrufen die mit der eigentlichen Aufgabe der aufgerufenen Funktion nichts zu tun haben.
Antworten