Seite 1 von 1

if anweisung führt keinen else block aus --> Anfänger

Verfasst: Mittwoch 15. Januar 2014, 22:35
von Hartmannsgruber
Hallo,

ich bin neu hier im Forum und auch Pythonneuling.
Ich habe ein Problem, die Lösung ist wahrscheinlich zwar sehr simpel, aber ich verzweifle dran :(

Code: Alles auswählen

#Abfrage
print ("Was möchten Sie tun?\n\n1, 2 oder 3?\n")
abfrage = input("1 oder 2 oder 3 eingeben: \n")

if abfrage == 1 or 2 or 3:
    print("richtig")
else:
    print ("falsch")

Ich gebe nun bei der Abfrage 1 ein -> ausgabe richitig erscheint
Wenn ich aber nun 5 eingebe -> ausgabe richtig erscheint, sollte aber falsch erscheinen
Was stimmt denn nur nicht ?

BITTE HILFE :(

Re: if anweisung führt keinen else block aus --> Anfänger

Verfasst: Mittwoch 15. Januar 2014, 22:55
von Darii
Ich setze mal Klammern für dich:

Code: Alles auswählen

if (abfrage == 1) or 2 or 3:
Also falls abfrage != 1 ist wird geprüft ob 2 "wahr" ist, was es immer ist.

Code: Alles auswählen

>>> bool(2)
True
Da steht also effektiv so etwas wie:

Code: Alles auswählen

if True:

Re: if anweisung führt keinen else block aus --> Anfänger

Verfasst: Mittwoch 15. Januar 2014, 23:34
von BSA
Oder das ganze ausgeschrieben:

Code: Alles auswählen

if abfrage == 1 or abfrage == 2 or abfrage == 3:
    ...
else:
    ...

Re: if anweisung führt keinen else block aus --> Anfänger

Verfasst: Mittwoch 15. Januar 2014, 23:51
von Hartmannsgruber
Ich habe die Codezeile jetzt auf so geändert, das Problem bleibt aber das gleiche :(

Code: Alles auswählen

if abfrage == (1 or 2 or 3):
1 wird richtig ausgegeben, ab 2 wird immer falsch ausgegeben.
Bitte Erklären warum.

Re: if anweisung führt keinen else block aus --> Anfänger

Verfasst: Donnerstag 16. Januar 2014, 00:03
von EyDu
Vielleicht, noch eine kurze Ausführung, damit du das Problem auch verstehen kannst: Die Opereratoren "or" und "and" darfst du nicht umgangssprachlich verstehen. Es handelt sich dabei um das logische Oder und das logische Und. Wenn du schreibst

Code: Alles auswählen

x == 42 or 23 or 2
bedeutet das nicht "wenn x den Wert 42 hat oder den Wert 23 oder den Wert 2". In Programmiersprachen verknüpft das Oder zwei Aussagen: das was links vom or steht und das was rechts vom or steht. ``x or y`` bedeutet also: Wenn x wahr ist oder wenn y wahr ist. Wenn du also ``x == 42 or 23 or 2`` schreibst wird das interpretiert als: Wenn x==42 ist oder wenn 23 wahr ist oder wenn 2 wahr ist.

Nun zu deinem letzten Post: Nein, an den Klammern hat es nicht gelegen, dein Ausdruck ist immer noch nicht korrekt. ``1 or 2 or 3`` bedeutet: falls 1 wahr ist oder 2 wahr ist oder 3 wahr ist. Da alle Zahlen ungleich 0 zu wahr ausgewertet werden, kannst du das ``(1 or 2 or 3)``(im Prinzip) durch den Wert True ersetzen. Damit bleibt dann ``abfrage == True`` übrig. Dein Ergebnis stimmt nur dann zufällig wenn abfrage den Wert 1 hat, da True äquivalent zu 1 ist. Deine Zeile hättest du aber auch ganz selbst einfach mal selber testen können

Richtig lautet die Abfrage:

Code: Alles auswählen

if abfrage in (1, 2, 3)
.
Damit prüfst du, ob abfrage ein Element aus (1, 2, 3) ist.

Re: if anweisung führt keinen else block aus --> Anfänger

Verfasst: Donnerstag 16. Januar 2014, 00:07
von Hartmannsgruber
Vielen Vielen lieben Dank, für deine super Erklärung, EyDu.
Jetzt kapier auch ich es, habe das "or" zu Umgangsprachlich genommen :-)

Re: if anweisung führt keinen else block aus --> Anfänger

Verfasst: Donnerstag 16. Januar 2014, 08:06
von Sirius3
Nu eine Ergänzung zu EyDu: der Ausdruck (1 or 2 or 3) führt nicht zum Ergebnis Wahr, weil 1 wahr ist, sondern zum Ergebnis 1 weil 1 wahr ist:

Code: Alles auswählen

>>> 0 or 42 or -7
42