2013-07-24 6 views
16

In Python überspringen I for-Schleife in der Regel eine Schleife durch Bereiche einfach durchWie kann ich ein paar Iterationen in ein

aber jetzt möchte ich ein paar Schritte in der Schleife überspringen. Genauer gesagt möchte ich etwas wie continue(10), so dass es die ganze Schleife überspringen und den Zähler um 10 erhöhen würde. Wenn ich eine for-Schleife in C verwenden würde, würde ich nur 10 bis i summieren, aber in Python, das nicht wirklich funktioniert .

Antwort

16

Sie können die Zielliste (i in diesem Fall) einer for-Schleife nicht ändern. Verwenden einer while Schleife statt:

while i < 10: 
    i += 1 
    if i == 2: 
     i += 3 

Alternativ verwenden ein iterable und inkrementieren, dass:

from itertools import islice 

numbers = iter(range(10)) 
for i in numbers: 
    if i == 2: 
     next(islice(numbers, 3, 3), None) # consume 3 

durch das Ergebnis der iter() einer lokalen Variablen zuweisen, können wir die Loop-Sequenz innerhalb der Schleife Voraus mit Standard-Iterationswerkzeuge (next() oder hier eine verkürzte Version des itertools Verbrauchsrezepts). for ruft normalerweise iter() für uns auf, wenn ein Iterator durchlaufen wird.

+4

dachte ich, das könnte der Fall sein, während Schleifen obwohl nur traurig sind. –

+0

Endlich mit der while-Schleife! Danke vielmals! –

+0

@AlexS Wenn Sie über Zahlen iterieren, ist das in Ordnung - wenn Sie diese Zahlen als Indizes für Listen oder was auch immer verwenden, tun Sie das bitte nicht. Iterieren nach Index ist in jeder Hinsicht schlecht. –

20

Der beste Weg ist, dem Iterator einen Namen zu geben - es ist üblich, dass er iterierbar im Gegensatz zu einem Iterator hat (der Unterschied ist iterierbar - zum Beispiel eine Liste - beginnt bei jeder Iteration von vorne). In diesem Fall verwenden Sie nur the iter() built-in function:

numbers = iter(range(100)) 

Dann Sie es innerhalb der Schleife den Namen mit voranbringen können. Der beste Weg dazu ist the itertoolsconsume() recipe - da es schnell ist (es verwendet itertools Funktionen, um sicherzustellen, dass die Iteration in Low-Level-Code passiert, macht den Prozess der Verwendung der Werte sehr schnell, und vermeidet die Verwendung von Speicher durch Speichern der verbrauchten Werte):

numbers = iter(range(100)) 
for i in numbers: 
    ... 
    if some_check(i): 
     consume(numbers, 3) # Skip 3 ahead. 
+0

Beachten Sie, dass Sie auch in Python 3 * iter() 'auf' range() 'aufrufen müssen, damit dies funktioniert. Das Python 3 'range()' Objekt ist eine Sequenz (ein iterabler), kein Iterator. –

+0

@MartijnPieters Unglaublich guter Punkt. Bearbeitet. Ich überspringe Bereiche so wenig, dass ich vergessen habe, dass das der Fall war. –

+0

Große Antwort +1 –

4

Warum setzen nicht nur den Wert, bis zu überspringen:

from itertools import islice 
import collections 

def consume(iterator, n): 
    "Advance the iterator n-steps ahead. If n is none, consume entirely." 
    # Use functions that consume iterators at C speed. 
    if n is None: 
     # feed the entire iterator into a zero-length deque 
     collections.deque(iterator, maxlen=0) 
    else: 
     # advance to the empty slice starting at position n 
     next(islice(iterator, n, n), None) 

dies tun, können Sie so etwas wie tun? Wie:

skip_until = 0 
for i in range(100): 
    if i < skip_until: 
     continue 
    if SOME_CONDITION: 
     skip_until = i + 10 
    DO_SOMETHING() 

wo SOME_CONDITION was auch immer bringt Sie überspringen und do_something() ist die eigentliche Schleife Inhalte?

+0

+1, 'continue' ist der am wenigsten gewundene Weg. – 2rs2ts

+0

Es ist erwähnenswert, dass dies erfordert, dass die Schleife in Python ausgeführt wird, und der Name jedes Mal vergeben wird - obwohl es in den meisten Fällen kein Problem ist, ist es in diesem Sinne weit weniger effizient. –

+0

Ja, aber angesichts der Einfachheit der Frage dachte ich, er wollte eine einfache Antwort; Das Mischen mit Iteratoren erscheint wie Overkill, wenn die Loops/Skips klein sind. –

-2
for i in range(0, 100, 10): 
    print(i) 

druckt 0, 10, 20 ...

+1

Hallo, obwohl dies die ersten 10 Werte überspringt, denke ich, dass der Fragesteller mehr daran interessiert war, wie man einen willkürlichen Wert während ** in der Schleife ** überspringen kann. Siehe die obere Antwort für ein Beispiel. – seth

+0

Sie brauchen Python 3.3 dafür definitiv auch nicht. –

Verwandte Themen