Schleife beenden

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
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

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
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

''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?)
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

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 ;)
Zuletzt geändert von Shaldy am Montag 28. Juni 2010, 15:35, insgesamt 1-mal geändert.
Dies ist keine Signatur!
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

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
Zuletzt geändert von Nebelhom am Montag 28. Juni 2010, 17:12, insgesamt 1-mal geändert.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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
In specifications, Murphy's Law supersedes Ohm's.
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
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@BlackJack, ich versteh nicht was du meinst, die äußere zählt bei mir ja auch nur bis 5 (range(6))
the more they change the more they stay the same
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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:
the more they change the more they stay the same
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich würde einfach einen Generator verwenden. Nebelhorn hat ihn ja fast schon hingeschrieben.
Das Leben ist wie ein Tennisball.
Antworten