Seite 1 von 1

Schleife beenden

Verfasst: Montag 28. Juni 2010, 15:13
von Peak_me
hallo!

Ich möchte, dass die Schleife bei x=[5,4] aufhört.

Doch weder das

Code: Alles auswählen

for i in range(10):
    for j in range(10):
        x=[i,j]
        if x==[5,4]:
            break
noch das

Code: Alles auswählen

while x!=[5,4]:
    for i in range(10):
        for j in range(10):
            x=[i,j]
funkioniert.
Es läuft immer bis x=[9,9] durch.

Wie geht es richtig?


Gruß
Paul

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 15:27
von .robert
''break'' brich immer nur die nächste for oder while Schleife ab. Wenn du dir die x mal ausgeben würdest, würdest du sehen, dass nach [5,4] die innere Schleife aufhört und als nächstes nicht [5,5] sondern [6,0] kommt.
Du musst die zweite Schleife auch noch abbrechen, wenn [5,4] erkannt wurde.

Ich vermute aber mal, dass das was du vorhast auch eleganter geht... (was ist denn dein Ziel?)

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 15:30
von Shaldy
Hi Paul!

Zum ersten:

Da liegt der Fehler im break Befehl. Damit wird nur die innere Schleife abgebrochen. Die äußere Schleife (also die mit i als Zählvariable) läuft dann natürlich immernoch.
Du könntest das Problem entweder so lösen, dass du den Code in eine Funktion auslagerst und statt break return benutzt, oder etwa:

Code: Alles auswählen

for i in range(10):
    for j in range(10):
        x = [i, j]
        if x == [5, 4]:
            gefunden = True
            break
    if gefunden == True:
        break
Dabei wäre das erste imo eleganter gelöst ;)

Zum zweiten:
Der Code innerhalb einer while Schleife wird doch immer komplett ausgeführt, bis die Schleife ihre Bedingung prüft. Dabei laufen die beiden for Schleifen natürlich erstmal komplett zu ende.
Dein zweiter Ansatz sollte sich eigentlich gar nicht von selbst beenden oO

Mein Vorschlag wäre:

Code: Alles auswählen

def Funktion(maxX, maxY, endX, endY):
    for x in range(maxX):
        for y in range(maxY):
            if x == endX and y == endY:
                return (x, y)
Soweit von mir.

@Nebelhom: Erster ;)

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 15:31
von Nebelhom
hmmm... mit return innerhalb einer funktion geht's

Code: Alles auswählen

def test():

    for i in range(10):
        for j in range(10):
            x=[i,j]
            print x
            if x==[5,4]:
                return


if __name__ == '__main__':
    test()
Das hier habe ich durch google (erster hit) gefunden.
4.4 break and continue Statements, and else Clauses on Loops

The break statement, like in C, breaks out of the smallest enclosing for or while loop.

The continue statement, also borrowed from C, continues with the next iteration of the loop.
das break statement gilt nur fuer den kleinsten loop. aber ich dneke das geht auch eleganter.

@Shaldi: Unfair! War abseits :D

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 17:07
von b.esser-wisser
Es gibt noch "else" nach den Schleifen:

Code: Alles auswählen

In [3]: for i in xrange(10):
   ...:     for j in xrange(10):
   ...:         x = [i, j]
   ...:         if x == [5,4]:
   ...:             break
   ...:     else: # DIESES else gehört zu dem 2. for - NICHT zu dem if!
   ...:         continue
   ...:     break
In [4]: print x
Das sieht aber alles nicht besonders schön aus - evtl ist das eine Löung mit itertools.product oder einem eigenen Generator besser.
hth, Jörg

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 17:43
von pillmuncher
b.esser-wisser hat geschrieben:Das sieht aber alles nicht besonders schön aus - evtl ist das eine Löung mit itertools.product oder einem eigenen Generator besser.
Yup:

Code: Alles auswählen

from itertools import product
ten = range(10)
for tup in product(ten, ten):
    if tup == (5,4):
        break
print tup

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 18:08
von BlackJack
Das sieht mir noch zu "unfunktional" aus. :-)

Code: Alles auswählen

from functools import partial
from itertools import product, takewhile
from operator import ne

ten = range(10)
for item in takewhile(partial(ne, (5, 4)), product(ten, ten)):
    print item

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 18:28
von DaMutz
vielleicht eine blöde Frage, aber warum lässt du die äussere Schleife überhaupt bis 9 durchzählen?

Die würde nämlich auch funktionieren:

Code: Alles auswählen

for i in range(6):
    for j in range(10):
        x=[i,j]
        if x==[5,4]:
            break

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 19:56
von Dav1d
DaMutz hat geschrieben:vielleicht eine blöde Frage, aber warum lässt du die äussere Schleife überhaupt bis 9 durchzählen?
Dann könnte man auch die Innere bis 4 Zählen lassen...

Code: Alles auswählen

for i in range(6):
    for j in range(5):
        x=[i,j]
        if x==[5,4]:
            break

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 20:02
von BlackJack
@Dav1d: Das bringt aber nicht das selbe Ergebnis weil bei allen anderen äusseren Schleifendurchläufen ja immer noch bis 10 gezählt werden soll, nur beim letzten mal nicht.

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 20:05
von Dav1d
@BlackJack, ich versteh nicht was du meinst, die äußere zählt bei mir ja auch nur bis 5 (range(6))

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 20:33
von EyDu
Dav1d hat geschrieben:@BlackJack, ich versteh nicht was du meinst, die äußere zählt bei mir ja auch nur bis 5 (range(6))
Deine innere Schleife sollte zu Beginn auch bis 9 laufen.

Re: Schleife beenden

Verfasst: Montag 28. Juni 2010, 20:39
von BlackJack
@Dav1d: Wenn man die Werte in der inneren Schleife ausgibt, sollte so etwas herauskommen:

Code: Alles auswählen

(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(0, 5)
(0, 6)
(0, 7)
(0, 8)
(0, 9)
(1, 0)
(1, 1)
(1, 2)
(1, 3)
(1, 4)
(1, 5)
(1, 6)
(1, 7)
(1, 8)
(1, 9)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(2, 5)
(2, 6)
(2, 7)
(2, 8)
(2, 9)
(3, 0)
(3, 1)
(3, 2)
(3, 3)
(3, 4)
(3, 5)
(3, 6)
(3, 7)
(3, 8)
(3, 9)
(4, 0)
(4, 1)
(4, 2)
(4, 3)
(4, 4)
(4, 5)
(4, 6)
(4, 7)
(4, 8)
(4, 9)
(5, 0)
(5, 1)
(5, 2)
(5, 3)
Die innere Schleife soll also in allen bis auf einem Schleifendurchlauf schon bis 10 gehen.

Aber wenn ich mal raten müsste war das feste Tupel als Kriterium nur ein Beispiel und im echten Programm ist das Abbruchkriterium nicht so statisch.

Re: Schleife beenden

Verfasst: Dienstag 29. Juni 2010, 15:34
von Dav1d
Aber wenn ich mal raten müsste war das feste Tupel als Kriterium nur ein Beispiel und im echten Programm ist das Abbruchkriterium nicht so statisch.
Dann dürfte man die äußere Anzahl auch nicht verringern

und danke für die Erklärung :lol:

Re: Schleife beenden

Verfasst: Dienstag 29. Juni 2010, 16:54
von DaMutz
BlackJack hat geschrieben:Aber wenn ich mal raten müsste war das feste Tupel als Kriterium nur ein Beispiel und im echten Programm ist das Abbruchkriterium nicht so statisch.
Wenn die Abbrechbedingung aber vor dem eintreten der ersten Schlaufe bekannt ist, wäre meine "Lösung" wieder realisierbar. Wie auch immer solange Peak_me keine Antwort gibt wissen wir es nicht...

Re: Schleife beenden

Verfasst: Dienstag 29. Juni 2010, 17:20
von EyDu
Ich würde einfach einen Generator verwenden. Nebelhorn hat ihn ja fast schon hingeschrieben.