Beispiel für die Verwendung der Anweisung "continue" in Python?

177

Die Definition der continueAussage lautet:

Die continueAnweisung wird mit der nächsten Iteration der Schleife fortgesetzt.

Ich kann keine guten Beispiele für Code finden.

Könnte jemand einige einfache Fälle vorschlagen, in denen dies continuenotwendig ist?

JohnG
quelle

Antworten:

217

Hier ist ein einfaches Beispiel:

for letter in 'Django':    
    if letter == 'D':
        continue
    printf("Current Letter: {letter}")

Ausgabe wird sein:

Current Letter: j
Current Letter: a
Current Letter: n
Current Letter: g
Current Letter: o

Es wird mit der nächsten Iteration der Schleife fortgefahren.

Snehal Parmar
quelle
1
Ich habe in den letzten drei oder vier Tagen darüber nachgedacht, warum ich jemals eine "Weiter" -Erklärung brauchen sollte, und dann stoße ich auf diesen Beitrag, der mir wiederum bei der Qualitätssicherung hilft - vielen Dank!
Freddy
3
Wenn wir hier ein Python-Skript schreiben (für Cron-Jobs) und große Werte iterieren und eine Ausnahme auftritt, wird der Cron-Job gestoppt und Sie können erst am nächsten Tag wissen, dass dies in diesem Fall sehr hilfreich ist. Ja In Ausnahmefällen können wir die Funktion zum Senden von E-Mails schreiben, aber die Ausführung wird trotzdem gestoppt.
Snehal Parmar
2
Dies zeigt, was continuetut, aber es ist nicht übermäßig nützlich, wenn Sie tun könntenif letter != 'D': print 'Current Letter:', letter
Chris_Rands
Ich hätte Pray / remove r oder Fast / remove s gewählt.
Benjamin Crouzier
101

Ich verwende Continue gerne in Loops, in denen viele Bedingungen zu erfüllen sind, bevor Sie "zur Sache" kommen. Also anstelle von Code wie diesem:

for x, y in zip(a, b):
    if x > y:
        z = calculate_z(x, y)
        if y - z < x:
            y = min(y, z)
            if x ** 2 - y ** 2 > 0:
                lots()
                of()
                code()
                here()

Ich bekomme folgenden Code:

for x, y in zip(a, b):
    if x <= y:
        continue
    z = calculate_z(x, y)
    if y - z >= x:
        continue
    y = min(y, z)
    if x ** 2 - y ** 2 <= 0:
        continue
    lots()
    of()
    code()
    here()

Auf diese Weise vermeide ich sehr tief verschachtelten Code. Es ist auch einfach, die Schleife zu optimieren, indem zuerst die am häufigsten auftretenden Fälle eliminiert werden, so dass ich mich nur mit den seltenen, aber wichtigen Fällen befassen muss (z. B. Divisor ist 0), wenn es keinen anderen Showstopper gibt.

Lauritz V. Thaulow
quelle
2
Daher wird "Weiter" hauptsächlich zur besseren Lesbarkeit verwendet, indem Einrückungen reduziert werden. Ich frage mich, ob "weiter" Ausdruckskraft hinzufügt.
JohnG
13
Die Verwendung continueauf diese Weise ähnelt der Verwendung GOTO. Dies ist jedoch der richtige Weg GOTO.
Dotancohen
1
@JohnG Ich glaube nicht, dass es eine Verwendung von continue (oder break) gibt, die ohne sie nicht reproduziert werden kann, obwohl es zur Laufzeit teuer sein kann, sie nicht zu haben.
Sparr
18

Normalerweise ist die Situation, in der fortfahren notwendig / nützlich ist, wenn Sie den verbleibenden Code in der Schleife überspringen und die Iteration fortsetzen möchten.

Ich glaube nicht wirklich, dass es notwendig ist, da Sie immer if-Anweisungen verwenden können, um dieselbe Logik bereitzustellen, aber es könnte nützlich sein, die Lesbarkeit von Code zu verbessern.

pcalcao
quelle
23
Beachten Sie, dass die Verwendung einer Einrückungsstufe, die sonst erforderlich wäre, wenn sie ohne sie geschrieben würde , if <condition>: continueeher verwendet als if not <condition>: ...vermieden wird.
Dan D.
1
Ich wollte gerade ein ähnliches Qn wie JohnG posten, stellte dann aber fest, dass er bereits gefragt hatte, was ich wissen wollte. Das Lesen aller Antworten hier hat geholfen, aber ich muss immer noch sicher sein, dass wir, wenn wir eine continueAnweisung verwenden, im Wesentlichen aus einem Abschnitt mit bedingten Tests herausspringen und die Iteration der Schleife fortsetzen können zur nächsten Iteration? Mir ist nicht klar, wie das besser wäre als zu benutzen else. Geht es nur um verbesserte Lesbarkeit und Laufzeitleistung?
AKKO
"Ich glaube nicht, dass es notwendig ist" ... nun, Python-Schöpfer dachten anders.
Jean-François Fabre
12
import random  

for i in range(20):  
    x = random.randint(-5,5)  
    if x == 0: continue  
    print 1/x  

continue ist eine äußerst wichtige Kontrollanweisung. Der obige Code zeigt eine typische Anwendung an, bei der das Ergebnis einer Division durch Null vermieden werden kann. Ich benutze es oft, wenn ich die Ausgabe von Programmen speichern muss, aber ich möchte die Ausgabe nicht speichern, wenn das Programm abgestürzt ist. Um das obige Beispiel zu testen, ersetzen Sie die letzte Anweisung durch print 1 / float (x). Andernfalls erhalten Sie Nullen, wenn ein Bruch vorhanden ist, da randint eine Ganzzahl zurückgibt. Ich habe es aus Gründen der Klarheit weggelassen.

user1871712
quelle
9

Einige Leute haben sich zur Lesbarkeit geäußert und gesagt: "Oh, das hilft der Lesbarkeit nicht so sehr, wen interessiert das?"

Angenommen, Sie benötigen eine Überprüfung vor dem Hauptcode:

if precondition_fails(message): continue

''' main code here '''

Beachten Sie, dass Sie dies tun können, nachdem der Hauptcode geschrieben wurde, ohne diesen Code trotzdem zu ändern. Wenn Sie den Code unterscheiden, wird nur die hinzugefügte Zeile mit "Weiter" hervorgehoben, da keine Abstandsänderungen am Hauptcode vorgenommen werden.

Stellen Sie sich vor, Sie müssen einen Breakfix des Produktionscodes erstellen, der sich einfach als Hinzufügen einer Zeile mit continue herausstellt. Es ist leicht zu erkennen, dass dies die einzige Änderung ist, wenn Sie den Code überprüfen. Wenn Sie den Hauptcode in if / else einschließen, hebt diff den neu eingerückten Code hervor, es sei denn, Sie ignorieren Abstandsänderungen, was insbesondere in Python gefährlich ist. Ich denke, wenn Sie nicht in der Situation waren, in der Sie kurzfristig Code einführen müssen, werden Sie dies möglicherweise nicht vollständig zu schätzen wissen.

CS
quelle
5
def filter_out_colors(elements):
  colors = ['red', 'green']
  result = []
  for element in elements:
    if element in colors:
       continue # skip the element
    # You can do whatever here
    result.append(element)
  return result

  >>> filter_out_colors(['lemon', 'orange', 'red', 'pear'])
  ['lemon', 'orange', 'pear']
ILYA Khlopotov
quelle
4
Aber was bedeutet die continueAussage hinzufügen hier? Es könnte durch Verwendung beseitigt werden element not in colors, und der Code wäre genauso lesbar.
Ekhumoro
4

Angenommen, wir möchten alle Zahlen drucken, die keine Vielfachen von 3 und 5 sind

for x in range(0, 101):
    if x % 3 ==0 or x % 5 == 0:
        continue
        #no more code is executed, we go to the next number 
    print x
ytpillai
quelle
Sie könnten auch nur verwenden if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Wildcard
Der richtige Weg ist, entweder continue oder den Operator not zu verwenden. Warum unnötig pass verwenden?
Ytpillai
Ich mag deinen Weg besser (daher die Gegenstimme). Ich bin auf diese Seite gekommen, um herauszufinden, ob jemals eine Verwendung erforderlich istcontinue . Mein Fazit ist, dass es nie einen Bedarf gibt , aber in einigen Fällen (wie diesem) ist der Code mit besser lesbar continue. Es ist ein sehr gutes Beispiel.
Wildcard
3

Dies ist nicht unbedingt erforderlich, da es mit IFs durchgeführt werden kann, aber es ist besser lesbar und zur Laufzeit auch kostengünstiger.

Ich benutze es, um eine Iteration in einer Schleife zu überspringen, wenn die Daten einige Anforderungen nicht erfüllen:

# List of times at which git commits were done.
# Formatted in hour, minutes in tuples.
# Note the last one has some fantasy.
commit_times = [(8,20), (9,30), (11, 45), (15, 50), (17, 45), (27, 132)]

for time in commit_times:
    hour = time[0]
    minutes = time[1]

    # If the hour is not between 0 and 24
    # and the minutes not between 0 and 59 then we know something is wrong.
    # Then we don't want to use this value,
    # we skip directly to the next iteration in the loop.
    if not (0 <= hour <= 24 and 0 <= minutes <= 59):
        continue

    # From here you know the time format in the tuples is reliable.
    # Apply some logic based on time.
    print("Someone commited at {h}:{m}".format(h=hour, m=minutes))

Ausgabe:

Someone commited at 8:20
Someone commited at 9:30
Someone commited at 11:45
Someone commited at 15:50
Someone commited at 17:45

Wie Sie sehen können, hat es der falsche Wert nach der continueAnweisung nicht geschafft.

Bastian
quelle
ifkann nur tun, was continuepassiert, wenn der gesamte Code in einem Block enthalten ist. continueÜberspringt Code, der sich sogar außerhalb des ifBlocks befindet.
Bryc
Warum ist Stunde 24 inklusive, Minute ist 60 exklusiv?
Patrick Artner
Kein besonderer Grund, nur ein Beispiel, zögern Sie nicht zu bearbeiten
Bastian
1

Zum Beispiel, wenn Sie je nach Wert einer Variablen verschiedene Dinge tun möchten:

my_var = 1
for items in range(0,100):
    if my_var < 10:
        continue
    elif my_var == 10:
        print("hit")
    elif my_var > 10:
        print("passed")
    my_var = my_var + 1

Wenn ich im obigen Beispiel breakden Interpreter verwende, wird die Schleife übersprungen. Damit werden continuejedoch nur die if-elif-Anweisungen übersprungen und direkt zum nächsten Element der Schleife gewechselt.

jonathan.hepp
quelle
3
Ihr Beispiel wird niemals etwas drucken, da die erste Bedingung immer wahr ist. unter der Annahme eines Anfangswertes für my_varvon 0.
Dan D.
Ich habe einfach ein Beispiel eines alten Codes von mir angepasst. Der ursprüngliche Wert des var ist nicht 0 und der zunehmende Teil wurde der Einfachheit halber hinzugefügt, da sein ursprünglicher Platz nicht vorhanden war. Da es ein Beispiel ist und sein Wert nicht wirklich wichtig ist, denke ich, dass es in Ordnung ist.
Jonathan.hepp
9
Es ist nicht okay. Es ist keine gute Werbung für die Verwendung continue.
John Machin
3
Und der erste elifsollte ein sein if. Der Code sieht einfach nicht so aus, als ob Sie wissen, was Sie tun.
John Machin
Dies ist ein schlechtes Beispiel
Patrick
0

continue Überspringt einfach den Rest des Codes in der Schleife bis zur nächsten Iteration

Yanfeng Liu
quelle