Seite 1 von 1
Python 3 "Else" nach wahrer "If" Aussage ausgeführt
Verfasst: Montag 24. August 2015, 08:15
von LucasTrever
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
Re: Python 3 "Else" nach wahrer "If" Aussage ausgeführt
Verfasst: Montag 24. August 2015, 08:24
von sparrow
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..
Re: Python 3 "Else" nach wahrer "If" Aussage ausgeführt
Verfasst: Montag 24. August 2015, 09:30
von jens
Böser Fehler
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
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()
(aber ich würde auch "in" verwenden bzw. .lower() nutzten)
Re: Python 3 "Else" nach wahrer "If" Aussage ausgeführt
Verfasst: Montag 24. August 2015, 10:29
von Sirius3
@LucasTrever: or ist eine logische Verknüpfung und kein umgangssprachliches Oder. Ohne die überflüssigen Klammern müßte es also so aussehen:
Zeile 13: Funktionen muß man Aufrufen, nicht nur Referenzieren: exit()
Zeile 16: Rekursive Aufrufe sind kein Schleifenersatz. Benutze ein "while True:" in deinem mainmenu.
Re: Python 3 "Else" nach wahrer "If" Aussage ausgeführt
Verfasst: Montag 24. August 2015, 16:07
von LucasTrever
@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
Ansonsten, noch einmal danke und lg,
Lucas
Re: Python 3 "Else" nach wahrer "If" Aussage ausgeführt
Verfasst: Montag 24. August 2015, 16:10
von sparrow
Zeig wie du es löst.
Re: Python 3 "Else" nach wahrer "If" Aussage ausgeführt
Verfasst: Montag 24. August 2015, 16:29
von 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.