Die Sache mit dem If und den Hexen

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
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Ich habe ein kleines Programm mit Hexen geschrieben. Es gibt vier Hexen, eine Schneehexe, eine Waldhexe, eine Sonnenhexe und eine Seehexe.

Code: Alles auswählen

#!/usr/bin/env python

Hexen = ["Schneehexe", "Sonnenhexe", "Waldhexe", "Seehexe"]

for Hexe in Hexen:
    print "\n\n aktuelle Hexe: " + Hexe
    if Hexe == "Schneehexe":
        print "Schneehexe ist da"
    if (Hexe == "Schneehexe") or (Hexe == "Waldhexe"):
        print "Es ist eine Schnee- oder Waldhexe"
    if Hexe == ("Sonnenhexe" or "Seehexe"):
        print "Sonnen- oder Seehexe"
Bei jedem Schleifendurchlauf wird geprüft, um welche Hexe es sich handelt.
Bei der letzten Prüfung wird nur geschaut, ob die "Sonnenhexe" grade da ist.
Ist die for-Schleife gerade bei der Seehexe, dann reagiert der dritte if-Block nicht auf die Waldhexe, ist die for-Schleife aber bei der Sonnenhexe, dann reagiert der if-Block, warum?

Meine Frage - darf ich nach if Hexe == ... hier keine zwei Einzelbedingungen reinschreiben und die mit or verknüpfen, sondern muss es stets wie bei der zweiten if-Abfrage tun?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Deine Idee mit dem fehlerhaften or war schon richtig, das hättest du auch selber ausprobieren können ;-) Du darfst das or in Programmiersprachen nicht mit dem umgangssprachlichem Oder verwechseln. Die Zeile ``("Sonnenhexe" or "Seehexe")`` bedeutet: Falls "Sonnenhexe" wahr ist oder falls "Seehexe" wahr ist (nicht entweder-oder; sondern die linke Seite, die rechte Seite oder beide Seiten). Das jeder nicht-leere String als wahr interpretiert wird, liefert der Ausruck "Sonnenhexe" als Ergebnis (or gibt immer den ersten wahren Ausdruck zurück oder den letzten falschen). Aus ``Hexe == ("Sonnenhexe" or "Seehexe")`` wird dann also ``Hexe == "Sonnenhexe"``. Das erklärt auch dein Ergebnis.

Statt langer if-Abfragen kannst du einfach den in-Operator verwenden: ``Hexe in ("Sonnenhexe" , "Seehexe")``.

P.S.: Schöner Betreff :mrgreen:
Das Leben ist wie ein Tennisball.
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Vielen Dank für Deine Antwort.
EyDu hat geschrieben:Deine Idee mit dem fehlerhaften or war schon richtig, das hättest du auch selber ausprobieren können ;-)
Ich habe doch natürlich das ausprobiert. Und weil ich mir nicht sicher war, warum es nicht klappte, hatte ich mir das Beispiel mit den Hexen ausgedacht und Du findest ja auch zwei unterschiedliche Doppel-If-Abfragen - aber um ganz sicher zu gehen, ob es wirklich nicht geht -habe ich meine Frage hier nochmal gestellt und Du warst so lieb, mir zu helfen.

Vielen Dank nochmal dafür.

Die Sache mit dem IN ist auch cool. So kann ich mir einen längeren Textstring definieren und kann if-Abfragen übersichtlicher gestalten.
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Der Tipp mit dem IN gefällt mir wunderbar, jetzt kann ich in einem Rutsch prüfen, ob die jeweilige Hexe die Erlaubnis zum Fliegen hat:

Code: Alles auswählen

#!/usr/bin/env python
Hexen = ["Schneehexe", "Sonnenhexe", "Waldhexe", "Seehexe"]

erlaubte_Hexen = ["Seehexe", "Sturmhexe", "Schneehexe", "Bierhexe", "Weinhexe"]

for Hexe in Hexen:
    print "\n\n aktuelle Hexe: " + Hexe
    if Hexe == "Schneehexe":
        print "Schneehexe ist da"
    if (Hexe == "Schneehexe") or (Hexe == "Waldhexe"):
        print "Es ist eine Schnee- oder Waldhexe"
    if Hexe == ("Sonnenhexe" or "Seehexe"):
        print "Sonnen- oder Seehexe"
    if Hexe in erlaubte_Hexen:
        print "Diese Hexe darf einen Besen zum fliegen benutzen"
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

>>> "Sonnenhexe" or "Seehexe"
'Sonnenhexe'
Die dazugehörige If-Abfrage checkt also jedes mal, ob Hexe den Wert "Sonnenhexe" hat. Nicht das, was du beabsichtigt hast …
Antworten