if-Anweisung mit and

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
vonDuebel
User
Beiträge: 1
Registriert: Sonntag 26. August 2012, 18:45

Hallo Leute,

ich steh grad voll auf dem Schlauch. Warum führt Python den Print-Befehl bei

Code: Alles auswählen

y = "hallo"

if ("x" and  "h") in y:
    print "found"
durch, aber bei

Code: Alles auswählen

y = "hallo"

if ("h" and  "x") in y:
    print "found"
nicht?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Du kannst nicht einfach natürliche Sprache irgendwie in Code kippen, so funktioniert das nicht. Dann gäbe es zu viele Doppeldeutigkeiten. im Fall von

Code: Alles auswählen

("x" and  "h") in y
musst du dir die Auswertung in etwas so vorstellen: es wird hier erst geprüft, ob "x" wahr ist oder nicht. Da dies zutrifft wird aus dem Ausdruck in etwa folgendes:

Code: Alles auswählen

(True and  "h") in y
Dann wird getestet, ob "h" wahr ist, was auch wieder zutriff, also:

Code: Alles auswählen

(True and  True) in y
Da nun links und rechts von and True steht, wird der Ausdruck auch Wahr

Code: Alles auswählen

True in y
Nun wird getestet, ob True in y vorkommt. Da eine Zeichenkette niemals True enthalten kann, ist das Ergebnis des Ausdrucks

Code: Alles auswählen

False
Du suchst den Ausdruck

Code: Alles auswählen

"x" in y and "h" in y
Nun zu der Situation, warum der erste Ausdruck scheinbar funktioniert und der zweite nicht. Ganz so strikt es es nämlich nicht, wie ich oben beschrieben habe. Das and liefert nämlich nicht True oder False zurück, sondern, immer die linke Seite oder die rechte Seite. Das hängt davon ab, welche Werte gegeben sind. Im ersten Beispiel wird hier das "h" als Ergebnis geliefert im unteren das "x". Ganz grob: sind beide Werte wahr, so wird der rechte wert als Ergebnis geliefert. Im ersten Fall bekommst du dann also ``"h" in "hallo"`` im zweiten hingegen ``"x" in "hallo"``.

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@vonDuebel: Weil 'h' in 'hallo' enthalten ist und 'x' nicht. Führe doch einfach mal den ``and``-Teilausdruck aus:

Code: Alles auswählen

In [137]: "x" and "h"
Out[137]: 'h'

In [138]: "h" and "x"
Out[138]: 'x'
Allgemein liefert ``and`` entweder das "falsche" Element oder das zweite wenn beide "wahr" sind. Und in einem boole'schen Kontext sind sowohl 'x' als auch 'h' "wahr", denn bei Zeichenketten ist nur die leere Zeichenkette "falsch".
Antworten