# Python: if-Schleife mit mehreren or-Bedingungen



## blck (26. Oktober 2010)

Hallo,
bin in Python noch nicht so fit. Die folgende if-Bedingung macht mir im Moment Probleme. Sieht nicht schön aus, muss aber der Nutzerfreundlichkeit IMHO so aussehen:

```
neur = 0
 while neur != 1:
   neu=input("Neue Aufgabe? Y oder N - Rechenart wechseln W ")
    if (neu != "Y") or (neu != "y") or (neu != "N") or (neu != "n") or (neu != "W") or (neu !=  "w"):
      neur = 0
      print("Deine Eingabe war nicht gültig! Gebe bitte Y/y bzw. N/n oder W/w ein.")
    else:
      neur = 1
```

Gibt es eine schönere Lösung hierfür? Try-Except funktioniert wegen der vielen Möglichkeiten schließlich nicht - vielleicht mache ich aber auch nur einen Denkfehler.

Edit: Habe mittlerweile die Funktion str.lower gefunden. if-Schleife sieht nun so aus: 
	
	
	



```
if (neu.lower() != "y") or (neu.lower() != "n") or (neu.lower() != "w"):
```
 funktionieren tut es leider immer noch nicht.

Danke für eure Hilfe,
Blck


----------



## Matthias Reitinger (26. Oktober 2010)

Hallo Blck,



blck hat gesagt.:


> funktionieren tut es leider immer noch nicht.


„Funktioniert nicht“ ist keine Problembeschreibung. Du musst schon sagen, welches Verhalten du erwartest und was stattdessen passiert. 

Ich vermute mal du hast ein Problem in der Logik deiner if-Bedingung. Überleg dir mal für welchen Wert von neu die Bedingung True ist.

Im Übrigen werden Schleifen in Python mit for oder while umgesetzt, eine „if-Schleife“ gibt es nicht.

Grüße,
Matthias


----------



## sheel (26. Oktober 2010)

Das Problem ist sicher, dass du statt or and nehmen musst


----------



## timestamp (26. Oktober 2010)

Für so viele Bedingungen bietet sich sicherlich auch ein switch-kontrukt an.


----------



## Matthias Reitinger (27. Oktober 2010)

sheel hat gesagt.:


> Das Problem ist sicher, dass du statt or and nehmen musst


Jetzt wollte ich Blck das Fischen lehren und dann kommst du und gibst ihm einfach einen Fisch (siehe Signatur)  



timestamp hat gesagt.:


> Für so viele Bedingungen bietet sich sicherlich auch ein switch-kontrukt an.


Welches es nur leider in Python nicht gibt.

Grüße,
Matthias


----------



## blck (27. Oktober 2010)

Hallo,
kenn deine Signatur noch mit dem Zusatz:"Und sorge dafür, dass man ihn fischen lässt" 
Funktioniert nicht meint: Die while-schleife beendet sich nicht - der parameter wird also nicht umgestellt. 
Wie kann eine Schleife, die if-schleife, funktionieren (an anderen stellen) wenn es sie nicht gibt?
Das and anstatt dem or macht IMHO keinen Sinn: schließlich soll es ja sein: wenn neu y oder n oder w ist. Und würde ja bedeuten, dass neu alles drei gleichzeitig sein muss. Oder ist das mein Denkfehler.

Danke, Blck


----------



## Matthias Reitinger (27. Oktober 2010)

blck hat gesagt.:


> Wie kann eine Schleife, die if-schleife, funktionieren (an anderen stellen) wenn es sie nicht gibt?


Du hast keine „if-Schleife“ in deinem Programm, auch nicht an anderen Stellen. Die Bezeichnung ist einfach falsch. Eine Schleife zeichnet sich dadurch aus, dass ein Programmteil durch sie (kein, ein- oder) mehrmals ausgeführt wird. Eine if-Anweisung ist dagegen eine Verzweigung. Du würdest eine Abzweigung in einer Straße (if-Anweisung) ja auch nicht als Kreisverkehr (Schleife) bezeichnen, oder? 



blck hat gesagt.:


> Das and anstatt dem or macht IMHO keinen Sinn: schließlich soll es ja sein: wenn neu y oder n oder w ist. Und würde ja bedeuten, dass neu alles drei gleichzeitig sein muss. Oder ist das mein Denkfehler.


Genau da liegt dein Denkfehler. Wenn man der Einfachkeit halber die Sache mit der Großschreibung für einen Moment außer acht lässt, dann lautet deine Anweisung:
	
	
	



```
if (neu != "y") or (neu != "n") or (neu != "w"):
```
Zu Deutsch: die Bedingung ist erfüllt, falls mindestens einer der folgenden Fälle eintritt:

neu ist nicht "y"
neu ist nicht "n"
neu ist nicht "w"

Egal welchen Wert neu jetzt hat: mindestens eine dieser Bedingungen ist immer erfüllt! Einfach mal für ein paar Werte durchdenken… und dann dasselbe nochmal mit and statt or. Dann müssen nämlich alle diese Fälle erfüllt sein. Und das ist genau das was du willst.

Alternativ könntest du deine ors lassen und stattdessen die != durch == ersetzen und gleichzeitig den if- und den else-Fall vertauschen. Das entspräche dann deiner Prosa-Formulierung „wenn neu y oder n oder w ist“.

Am schönsten fände ich aber dennoch folgende Variante, die ganz ohne logische Operatoren auskommt:

```
if neu.lower() not in ("y", "n", "w"):
```

Grüße,
Matthias


----------

