2009-01-29 13 views
12

ich habe:Python: Neustart einer Schleife

for i in range(2,n): 
    if(something): 
     do something 
    else: 
     do something else 
     i = 2 **restart the loop 

Aber das scheint nicht zu funktionieren. Gibt es eine Möglichkeit, diese Schleife neu zu starten?

Dank

Antwort

25

Sie können einen anderen Typ von Schleife verwenden, wenn diese Logik anwendbar ist, da dies die offensichtlichste Antwort ist.

vielleicht:

i=2 
while i < n: 
    if something: 
     do something 
     i += 1 
    else: 
     do something else 
     i = 2 #restart the loop 
+1

danke Perrow, nicht viel von einem Python Person ... noch. – gnomed

+0

Nur zur Erinnerung: Stellen Sie mit einer while-Schleife sicher, dass Sie eine Abbruchbedingung haben, die immer erfüllt werden kann. – Brandon

+0

Ich denke, das wird beendet, wenn i> = n – gnomed

10

die Indexvariable i von Ändern innerhalb der Schleife zu tun, es unwahrscheinlich ist, was Sie erwarten. Möglicherweise müssen Sie stattdessen eine while-Schleife verwenden und die Inkrementierung der Schleifenvariablen selbst steuern. Jedes Mal um die for Schleife wird i mit dem nächsten Wert von range() neu zugewiesen. So etwas wie:

i = 2 
while i < n: 
    if(something): 
     do something 
    else: 
     do something else 
     i = 2 # restart the loop 
     continue 
    i += 1 

In meinem Beispiel die continue Anweisung springt zurück bis zum Anfang der Schleife, das Überspringen der i += 1 Anweisung für diese Iteration. Sonst wird i wie erwartet inkrementiert (dasselbe wie die for-Schleife).

0

Ich wollte nur eine Alternative posten, die genearally nutzbar mehr sein könnte. Die meisten vorhandenen Lösungen verwenden einen Schleifenindex, um dies zu vermeiden. Aber Sie müssen keinen Index verwenden - der Schlüssel hier ist, dass im Gegensatz zu einer for-Schleife, bei der die Schleifenvariable ausgeblendet ist, die Schleifenvariable offen liegt.

Sie können tun, sehr ähnliche Dinge mit Iteratoren/Generatoren:

x = [1,2,3,4,5,6] 
xi = iter(x) 
ival = xi.next() 
while not exit_condition(ival): 
    # Do some ival stuff 
    if ival == 4: 
     xi = iter(x) 
    ival = xi.next() 

Es ist nicht so sauber, aber noch immer die Möglichkeit, die Schleife Iterator selbst zu schreiben.

Normalerweise, wenn Sie denken, dass Sie dies tun möchten, ist Ihr Algorithmus falsch, und Sie sollten es sauber umschreiben. Wahrscheinlich möchten Sie stattdessen einen Generator/Coroutine verwenden. Aber es ist zumindest möglich.

3

Hier ist ein Beispiel eines Generators unter Verwendung des send() method:

def restartable(seq): 
    while True: 
     for item in seq: 
      restart = yield item 
      if restart: 
       break 
     else: 
      raise StopIteration 

Verwendungsbeispiel:

x = [1, 2, 3, 4, 5] 
total = 0 
r = restartable(x) 
for item in r: 
    if item == 5 and total < 100: 
     total += r.send(True) 
    else: 
     total += item 
0
a = ['1', '2', '3'] 
ls = [] 
count = False 

while ls != a : 
    print(a[count]) 
    if a[count] != a[-1] : 
     count = count + 1 
    else : 
     count = False 

Restart while-Schleife.