Ich wollte wissen, ob es integrierte Möglichkeiten gibt, um mit der nächsten Iteration in der äußeren Schleife in Python fortzufahren. Betrachten Sie zum Beispiel den Code:
for ii in range(200):
for jj in range(200, 400):
...block0...
if something:
continue
...block1...
Ich möchte, dass diese continue-Anweisung die jj-Schleife verlässt und zum nächsten Element in der ii-Schleife wechselt. Ich kann diese Logik auf eine andere Weise implementieren (indem ich eine Flag-Variable setze), aber gibt es eine einfache Möglichkeit, dies zu tun, oder ist dies so, als würde man zu viel verlangen?
Antworten:
Im Allgemeinen können Sie eine der folgenden Aktionen ausführen, wenn Sie mehrere Schleifenebenen haben und
break
für Sie nicht funktionieren (weil Sie eine der oberen Schleifen fortsetzen möchten, nicht die direkt über der aktuellen)Refaktorieren Sie die Schleifen, aus denen Sie entkommen möchten, in eine Funktion
Der Nachteil ist, dass Sie möglicherweise einige Variablen an diese neue Funktion übergeben müssen, die zuvor im Gültigkeitsbereich waren. Sie können sie entweder einfach als Parameter übergeben, als Instanzvariablen für ein Objekt festlegen (ein neues Objekt nur für diese Funktion erstellen, wenn dies sinnvoll ist) oder als globale Variablen, Singletons (ehm, ehm).
Oder Sie können
inner
eine verschachtelte Funktion definieren und sie nur erfassen lassen, was sie benötigt (möglicherweise langsamer?)Verwenden Sie Ausnahmen
Philosophisch gesehen sind dies Ausnahmen, die den Programmfluss durch die strukturierten Programmierbausteine (wenn, für, während) bei Bedarf unterbrechen.
Der Vorteil ist, dass Sie den einzelnen Code nicht in mehrere Teile aufteilen müssen. Dies ist gut, wenn es sich um eine Art Berechnung handelt, die Sie beim Schreiben in Python entwerfen. Das Einführen von Abstraktionen an diesem frühen Punkt kann Sie verlangsamen.
Das Schlechte an diesem Ansatz ist, dass Interpreter / Compiler-Autoren normalerweise davon ausgehen, dass Ausnahmen außergewöhnlich sind, und sie entsprechend optimieren.
Erstellen Sie hierfür eine spezielle Ausnahmeklasse, damit Sie nicht versehentlich eine andere Ausnahme stumm schalten.
Etwas ganz anderes
Ich bin sicher, dass es noch andere Lösungen gibt.
quelle
Break
wird die innere Schleife unterbrechen und Block1 wird nicht ausgeführt (es wird nur ausgeführt, wenn die innere Schleife normal verlassen wird).quelle
for...else
ist oft ein nützliches Konstrukt, obwohl es verwirrend sein kann. Denken Sie daran, dasselse
dies in diesem Zusammenhang "keine Pause" bedeutet.In anderen Sprachen können Sie die Schleife beschriften und von der beschrifteten Schleife abbrechen. Python Enhancement Proposal (PEP) 3136 schlug vor, diese zu Python hinzuzufügen, aber Guido lehnte dies ab :
Wenn Sie also gehofft haben, dass Sie kein Glück haben, schauen Sie sich eine der anderen Antworten an, da es dort gute Möglichkeiten gibt.
quelle
for-else
komplizierter, schwieriger zu lesen und wahrscheinlich missbrauchter (wenn nicht ein völliger Fehler) ist als benannte Schleifen. Ich glaube, ich hätte ein anderes Schlüsselwort verwendet alselse
- vielleichtresume
wäre so etwas gut gewesen? Siebreak
in der Schleife und dasresume
ist gleich danach?Ich denke, Sie könnten so etwas tun:
quelle
for
habenelse
(und ich denke, selbst die meisten Menschen, die sich nicht erinnern können, wie es funktioniert).Ich denke, eine der einfachsten Möglichkeiten, dies zu erreichen, besteht darin, "continue" durch die Anweisung "break" zu ersetzen, d. H.
Hier ist zum Beispiel der einfache Code, um zu sehen, wie genau es weitergeht:
quelle
Eine andere Möglichkeit, mit dieser Art von Problem umzugehen, ist die Verwendung von Exception ().
Beispielsweise:
Ergebnis:
Angenommen, wir möchten von der m-Schleife zur äußeren n-Schleife springen, wenn m = 3:
Ergebnis:
Referenzlink: http://www.programming-idioms.org/idiom/42/continue-outer-loop/1264/python
quelle
Wir wollen etwas finden und dann die innere Iteration stoppen. Ich benutze ein Flaggensystem.
quelle
False:continue
Sache ist ... ungewöhnliche Formatierung. Wie es häufig in "natürlichen" Systemen der Fall ist, in denen Exponential die Norm sind, müssen Sie bei SO nur ein paar Mal Glück haben, um eine signifikante Anzahl von Reputationspunkten zu sammeln. Wie auch immer, meine "besten" Antworten sind normalerweise die am wenigsten populären.Ich habe so etwas einfach gemacht. Meine Lösung bestand darin, das Innere der for-Schleife durch ein Listenverständnis zu ersetzen.
Dabei ist op ein boolescher Operator, der auf eine Kombination von ii und jj einwirkt. In meinem Fall war ich fertig, wenn eine der Operationen true zurückgab.
Dies unterscheidet sich wirklich nicht wesentlich von der Aufteilung des Codes in eine Funktion, aber ich fand es interessant, den Operator "any" zu verwenden, um ein logisches ODER für eine Liste von Booleschen Werten zu erstellen und die Logik in einer Zeile auszuführen. Es vermeidet auch den Funktionsaufruf.
quelle