Seite 1 von 1

Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 11:04
von samid
Hallo zusammen,

ich weiß, dass der folgende Code überhaupt keinen Sinn ergibt, aber ich verstehe einfach nicht wieso die While Schleife nicht abbricht wenn a = "e"

Code: Alles auswählen

a = "-"
while a not in "eE" or a != "":
   if a in "wW":
      a = raw_input()
   else:
      a = raw_input()
Ich bin der Meinung, dass die Schleife am Anfang gestartet wird, dann komme ich gleich in den "else"-Block und gebe da den Wert "e" ein. So jetzt sollte doch die Schleife die Variable a prüfen und abbrechen da a = "e", aber das macht sie nicht. Wieso???

Danke für Antworten

Re: Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 11:13
von snafu
Naja, die erste Bedingung trifft nicht zu - also wertet Python die zweite Bedingung aus. Da die Eingabe "e" kein leerer String ist, trifft die zweite Bedingung zu und es erfolgt der nächste Durchlauf der `while`-Schleife. Würdest du einfach nur Enter bei der Eingabe drücken, dann bekäme er einen leeren String, wodurch beide Bedingungen *nicht* zutreffen und die Schleife daher abbricht.

Zur Veranschaulichung:

Code: Alles auswählen

>>> a = "e"
>>> a not in "eE" or a != ""
True
Und dies entspricht letztlich einem `while True:` (also einer Endlosschleife).

EDIT: Kann es sein, dass du sowas in der Art willst?

Code: Alles auswählen

>>> for eingabe in iter(raw_input, ''):
...     if eingabe.lower() == 'w':
...         print 'Es wurde "w" eingegeben.'
... else:
...     print 'Beende, da keine Eingabe erfolgt ist.'
... 
q
w
Es wurde "w" eingegeben.

Beende, da keine Eingabe erfolgt ist.

Re: Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 11:39
von samid
Ja klar, du hast recht. Das war nur ein logischer Fehler. Mannnnn. Ja sowas in der Art, nur mit muss ich die Kontrolle haben um aus der Schleife rauszukommen. In deiner Anweisung wäre es dann wahrscheinlich mit "break" möglich. Danke für die Antwort.

Re: Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 11:58
von snafu
samid hat geschrieben:[...] nur mit muss ich die Kontrolle haben um aus der Schleife rauszukommen. In deiner Anweisung wäre es dann wahrscheinlich mit "break" möglich.
Meine Variante kommt ohne `break` aus. Die Abbruchbedingung ist das zweite Argument, was ich `iter()` übergeben habe (leerer String). Danach wird in den `else`-Teil der `for`-Schleife gesprungen (ja, sowas gibt's in Python) und die Meldung ausgegeben, dass keine Eingabe getätigt wurde und die Abfrage dadurch beendet ist.

Das *kann* man durchaus so machen, aber eine `while`-Schleife mit `break`-Statement ist für viele wahrscheinlich lesbarer. Ich würde dann aber an deiner Stelle nur `while True:` als Schleifenbedingung setzen und im Inneren der Schleife die ganzen Tests machen. Dann ist man nicht gezwungen, einen Startwert für `eingabe` zu vergeben und der Ablauf wird etwas klarer, als wenn man eine (mehr oder weniger) komplizierte Bedingung in den Schleifenkopf packt (so wie du das ja jetzt gemacht hast).

Also in etwa so:

Code: Alles auswählen

while True:
    eingabe = raw_input('Ihre Eingabe: ')
    if not eingabe:
        print 'Beende, da keine Eingabe erfolgt ist.'
        break
    if eingabe.lower() == 'w':
        print 'Es wurde Menüpunkt "w" ausgewählt.'

Re: Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 12:03
von BlackJack
@snafu: Deine Variante kommt nicht ohne ``break`` aus — oder das ``else`` macht keinen Sinn, denn wenn man ein ``else`` für eine Schleife hat in deren Körper *kein* ``break`` steht, hat man was falsch gemacht.

Re: Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 12:11
von snafu
@BlackJack: Wie bereits beschrieben, ersetzt das zweite Argument vom `iter()` bei mir die `break`-Anweisung. Das mag eine eher ungewöhnliche Art sein, aber dass es *nicht* funktioniert, ist falsch. Bei mir verhält sich auch diese Variante erwartungsgemäß.

Re: Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 12:42
von jerch
@snafu:
Das zweite Argument von iter() ersetzt nicht ein break, es stoppt den Iterator und damit die Schleife, und hier macht Dein else keinen Sinn. Würde es tatsächlich ein break ersetzen, würde das else nicht erreicht werden.

Re: Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 13:04
von BlackJack
@snafu: Es funktioniert, aber es ist trotzdem falsch. Ein ``else`` macht ohne ``break`` schlicht keinen Sinn.

Re: Frage zur While Schleife

Verfasst: Samstag 2. November 2013, 15:13
von snafu
Der `else`-Teil kommt genau dann ins Spiel, wenn die `for`-Schleife bis zum Ende durchlaufen wurde. Das zweite Argument von `iter()` legt fest, wann die Ausgabe weiterer Elemente beendet werden soll. Wenn dies passiert, dann ist auch die `for`-Schleife beendet.

Ich verstehe jetzt aber, was ihr meint: Sobald die Schleife beendet wird, dann kommt es ja sowieso zur Ausführung von dem, was im `else`-Teil hinter der Schleife steht. Dann kann man sich das `else` auch sparen - stimmt.

Ich hatte mich darauf "eingeschossen":
BlackJack hat geschrieben:Deine Variante kommt nicht ohne ``break`` aus
...und den Rest der Aussage wohl ignoriert. :oops: