Seite 1 von 1

else bei for und while ???

Verfasst: Mittwoch 10. März 2004, 23:24
von Dookie
Hallo Leute,

jetzt hab ich auch mal eine Frage. Vor kurzem hab ich entdeckt, daß auch for und while ein else kennen, nur erschließt sich mit die Sinnhaftigkeit davon nicht.

Code: Alles auswählen

for i in xrange(10):
    print i,
else:
    print "Ende der Sequenz"
führt zur gleichen Ausgabe wie

Code: Alles auswählen

for i in xrange(10):
    print i,

print "Ende der Sequenz"
genauso wie bei

Code: Alles auswählen

for i in xrange(0):
    print i,
else:
    print "Ende der Sequenz"
das gleiche rauskommt

Code: Alles auswählen

for i in xrange(0):
    print i,

print "Ende der Sequenz"
oder auch

Code: Alles auswählen

i = 0
while i < 10:
    print i,

print "Ende der Sequenz"
das gleiche ergebnis ausgibt wie

Code: Alles auswählen

i = 0
while i < 10:
    print i,
else:
    print "Ende der Sequenz"
Die einzige Anwendung habe ich in der interaktiven Pythonconsole gefunden, wo der else zweig auch erst ausgeführt wird, wenn ich den for bzw while else Block verlasse.


Gruß

Dookie

Verfasst: Donnerstag 11. März 2004, 14:47
von Milan
Hi Dookie. das else wird, wie du bestimmt schon herausgefunden hast, nur ausgeführt, wenn die Schleifen vollständig durchlaufen wurden. Nach dem Aufruf eines breaks ist dies nicht gegeben und das kann man wunderbar ausnutzen. So musst du zum Beispiel keine Variablen belegen, um abzufragen, ob die Schleife vorzeitig abgebrochen wurde. Beispiel: erinner dich an die Primzahlberechnung und meinen ersten Lösungsvorschlag:
Milan hat geschrieben:Hi. Tut es nicht auch ein einfacher Test auf Teilbarkeit? Ist vielleicht nicht so effektiv, aber am Anfang leichter verständlich.

Code: Alles auswählen

erglist=[]
MAXPRIM = 10000
for zahl in xrange(2,MAXPRIM+1,1):
    for prim in erglist:
        if zahl%prim==0: break
    else:
        print zahl
        erglist.append(zahl)
Milan
Dasgleiche ist auch für while Schleifen machbar. Ich finde das else also durchaus sehr nützlich. Alles verstanden?

Milan

Verfasst: Donnerstag 11. März 2004, 15:40
von Dookie
Hi Milan,

danke, jo das ist ein Argument. Bei for-schleifen nutze ich praktisch nie ein break, entspricht nicht meinem Programmierstiel. Bei While könnte ich mir ab und zu einen Fall vorstellen wo es was bringt.
Irgendwie schauts bei Deinem Beispiel so aus als währe die Einrückung verrutscht ;)
Bisher bin ich auch ganz gut ohne ausgekommen aber gut zu wissen das sowas auch geht.


Gruß

Dookie

Verfasst: Donnerstag 11. März 2004, 16:07
von Sneaker
He cool gut zu wissen :) sowas sollte man sammeln ;)

Verfasst: Donnerstag 11. März 2004, 18:31
von Milan
Dookie hat geschrieben:Irgendwie schauts bei Deinem Beispiel so aus als währe die Einrückung verrutscht ;)
Hi. Das else bezieht sich ja auch auf die innere Schleife :wink:
Nochwas zur while Schleife: in der nächsten version von Python wird da noch ein optionales "do" dazukommen, dass vor der Schleife ausgeführt wird. Da kann dann Initialcode rein. Finde Ich auch sehr praktisch :D Nachzulesen im PEP 315

mfg, Milan

Verfasst: Donnerstag 11. März 2004, 18:49
von Sneaker
und wozu ist dieser anfang da ich kann doch wohl variablen auch ohne den do teil initialisieren oder was ist mit setup code gemeint ?

Verfasst: Donnerstag 11. März 2004, 19:16
von Dookie
so wie ich das rauslese, enspricht das einer repeat-until not ... schleife, mit dem Unterschied, dass vor und nach dem Prüfen der Bedingung code ausgeführt wird.
Heute schreibst Du z.B.:

Code: Alles auswählen

a = b/2
while a > 1:
    b = b-a
    a = b/2
bei Python 2.4 gehts dann

Code: Alles auswählen

do:
    a = b/2
while a > 1:
    b = b-a
Gruß

Dookie

Verfasst: Donnerstag 11. März 2004, 20:01
von Sneaker
Ahso verstehen code der sowieso nach jedem schleifen durchlaufa usgeführt werden soll, den kann man dann da rein schreiben ?

Verfasst: Donnerstag 11. März 2004, 20:50
von Milan
Hi. So würde ich das nicht sagen... der Block ist zum ausführen des codes gedacht, der Einfluss auf die Bedingung der Schleife hat und Zugleich vor dem ausführen der while-Schleife einmal durchlaufen werden muss. Insofern hat Dookie schon ganz recht. Das war aber auch überfällig, denn so kann man auch eine "fußgesteuerte" Schleife bauen und spaart sich auch aufwändigere Konstrukte, die das mit größerer Laufzeit erreichen.

Milan

Verfasst: Donnerstag 11. März 2004, 21:20
von Sneaker
also so ne art do while schleife wie in C++ ? die mindestens einmal durchlaufen wird ?

Verfasst: Donnerstag 11. März 2004, 21:45
von Dookie
jo die kannst damit machen, das würd dann so ausschaun

Code: Alles auswählen

do:
    mach was
while bedingung == True:
    pass

Dookie