else bei for und while ???

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Sneaker
User
Beiträge: 52
Registriert: Montag 19. Januar 2004, 22:19
Wohnort: Vor meinem Computer
Kontaktdaten:

He cool gut zu wissen :) sowas sollte man sammeln ;)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Sneaker
User
Beiträge: 52
Registriert: Montag 19. Januar 2004, 22:19
Wohnort: Vor meinem Computer
Kontaktdaten:

und wozu ist dieser anfang da ich kann doch wohl variablen auch ohne den do teil initialisieren oder was ist mit setup code gemeint ?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Sneaker
User
Beiträge: 52
Registriert: Montag 19. Januar 2004, 22:19
Wohnort: Vor meinem Computer
Kontaktdaten:

Ahso verstehen code der sowieso nach jedem schleifen durchlaufa usgeführt werden soll, den kann man dann da rein schreiben ?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Sneaker
User
Beiträge: 52
Registriert: Montag 19. Januar 2004, 22:19
Wohnort: Vor meinem Computer
Kontaktdaten:

also so ne art do while schleife wie in C++ ? die mindestens einmal durchlaufen wird ?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

jo die kannst damit machen, das würd dann so ausschaun

Code: Alles auswählen

do:
    mach was
while bedingung == True:
    pass

Dookie
Antworten