Esempio di utilizzo dell'istruzione "continue" in Python?


177

La definizione della continuedichiarazione è il seguente:

L' continueistruzione continua con la successiva iterazione del ciclo.

Non riesco a trovare buoni esempi di codice.

Qualcuno potrebbe suggerire alcuni casi semplici dove continueè necessario?

Risposte:


218

Ecco un semplice esempio:

for letter in 'Django':    
    if letter == 'D':
        continue
    print("Current Letter: " + letter)

L'output sarà:

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

Continua alla successiva iterazione del ciclo.


1
Ho riflettuto negli ultimi tre o quattro giorni, perché dovrei mai aver bisogno di una dichiarazione "continua" e poi mi imbatto in questo post che a sua volta mi aiuta con un po 'di QA - molte grazie!
Freddy

3
lo stesso qui, quando scriviamo script Python (per cron job) e iteriamo su valori di grandi dimensioni e si verificano alcune eccezioni, il cron job verrà interrotto e sarai solo in grado di sapere che il giorno successivo, aiuta davvero molto in questi casi, Sì possiamo scrivere la funzione di invio della posta in via eccezionale, ma l'esecuzione verrà comunque interrotta.
Snehal Parmar,

2
Questo illustra cosa continuefa, ma non è eccessivamente utile, quando potresti farloif letter != 'D': print 'Current Letter:', letter
Chris_Rands,

Avrei scelto Pray / remove r, o Fast / remove s.
Benjamin Crouzier,

102

Mi piace usare continue in loop in cui ci sono molte contese da soddisfare prima di "dedicarti al lavoro". Quindi, invece di un codice come questo:

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()

Ricevo un codice come questo:

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()

In questo modo evito codice nidificato molto profondamente. Inoltre, è facile ottimizzare il loop eliminando prima i casi che si verificano più frequentemente, quindi devo solo occuparmi dei casi rari ma importanti (ad esempio il divisore è 0) quando non ci sono altri showtopper.


2
Quindi "continua" viene utilizzato principalmente per la leggibilità riducendo il rientro. Mi chiedo se "continua" aggiunge qualche potere espressivo.
Giovanni G

14
L'uso continuein questo modo è simile all'utilizzo GOTO. Tuttavia, questo è il modo giusto di usare GOTO.
dotancohen,

1
@JohnG Non credo che ci sia alcun uso di continue (o break, del resto) che non può essere riprodotto senza di essa, anche se non averlo può essere costoso in fase di esecuzione.
Sparr,

18

Di solito la situazione in cui continue è necessario / utile è quando si desidera saltare il codice rimanente nel loop e continuare l'iterazione.

Non credo davvero che sia necessario, dal momento che puoi sempre usare if istruzioni per fornire la stessa logica, ma potrebbe essere utile per aumentare la leggibilità del codice.


23
notare che l'utilizzo if <condition>: continuepiuttosto che if not <condition>: ...evitare un livello di rientro che sarebbe altrimenti necessario se fosse scritto senza di esso.
Dan D.

1
Stavo per pubblicare un QN simile a JohnG, ma poi ho scoperto che aveva già chiesto cosa volevo sapere. Leggere tutte le risposte qui ha aiutato, ma ho ancora bisogno di essere sicuro di una cosa: è così che ogni volta che usiamo continueun'istruzione, stiamo essenzialmente saltando fuori da una sezione di test condizionale e permettendo all'iterazione del ciclo di continuare alla prossima iterazione? Non mi è chiaro come sarebbe meglio dell'uso else. Si tratta solo di migliorare la leggibilità e le prestazioni di runtime?
AKKO,

"Non credo sia necessario" ... beh, i creatori di Python hanno pensato diversamente.
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 è una dichiarazione di controllo estremamente importante. Il codice sopra indica un'applicazione tipica, in cui è possibile evitare il risultato di una divisione per zero. Lo uso spesso quando devo memorizzare l'output dai programmi, ma non voglio archiviare l'output se il programma si è bloccato. Nota, per testare l'esempio sopra, sostituisci l'ultima istruzione con print 1 / float (x), o otterrai degli zeri ogni volta che c'è una frazione, poiché randint restituisce un numero intero. L'ho omesso per chiarezza.


10

Alcune persone hanno commentato la leggibilità, dicendo "Oh, non aiuta molto la leggibilità, a chi importa?"

Supponiamo di aver bisogno di un controllo prima del codice principale:

if precondition_fails(message): continue

''' main code here '''

Nota che puoi farlo dopo che il codice principale è stato scritto senza modificarlo comunque. Se si differenzia il codice, verrà evidenziata solo la riga aggiunta con "continua" poiché non vi sono modifiche di spaziatura al codice principale.

Immagina se devi fare una colazione del codice di produzione, che risulta semplicemente aggiungere una riga con continue. È facile vedere che è l'unica modifica quando si esamina il codice. Se inizi a racchiudere il codice principale in if / else, diff evidenzierà il codice appena rientrato, a meno che non ignori le modifiche alla spaziatura, il che è particolarmente pericoloso in Python. Penso che a meno che tu non sia stato nella situazione in cui devi implementare il codice con breve preavviso, potresti non apprezzarlo appieno.


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']

4
Ma cosa aggiunge la continuedichiarazione qui? Potrebbe essere eliminato usando , e il codice sarebbe altrettanto leggibile. element not in colors
ekhumoro,

4

Supponiamo di voler stampare tutti i numeri che non sono multipli di 3 e 5

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

Si potrebbe anche solo usare if x %3 == 0 or x % 5 == 0:, pass, else:,print x
jolly

Il modo corretto è utilizzare continua o non l'operatore. Perché utilizzare inutilmente pass?
ytpillai,

Mi piace la tua strada migliore (da qui il voto). Sono arrivato a questa pagina cercando di risolvere se c'è mai bisogno di usarlo continue. La mia conclusione è che non c'è mai bisogno , ma in alcuni casi (come questo) il codice è più leggibile usando continue. È un ottimo esempio.
Wildcard il

3

Non è assolutamente necessario poiché può essere eseguito con gli IF ma è più leggibile e anche meno costoso in fase di esecuzione.

Lo uso per saltare un'iterazione in un ciclo se i dati non soddisfano alcuni requisiti:

# 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))

Produzione:

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

Come puoi vedere, il valore errato non è riuscito dopo l' continueistruzione.


ifpuò fare solo ciò che continuefa se tutto il codice è contenuto in un blocco. continuesalta il codice anche al di fuori del ifblocco.
bryc,

perché l' ora è compresa 24 ma i minuti sono 60 esclusivi?
Patrick Artner,

nessun motivo particolare, solo un esempio, non esitate a modificare
Bastian

1

Ad esempio, se vuoi fare cose diverse a seconda del valore di una variabile:

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

Nell'esempio sopra, se uso breakl'interprete salterà il ciclo. Ma con continueesso salta solo le istruzioni if-elif e passa direttamente all'elemento successivo del ciclo.


3
il tuo esempio non stamperà mai nulla, poiché la prima condizione è sempre vera. assumendo un valore iniziale per my_vardi 0.
Dan D.

Ho semplicemente adattato un esempio di un mio vecchio codice. Il valore originale di var non è 0 e la parte crescente è stata aggiunta per comodità poiché il suo posto originale non era presente. Dato che è un esempio e il suo valore non conta davvero, immagino sia ok.
jonathan.hepp,

9
Non va bene. Non è una buona pubblicità per l'utilizzo continue.
John Machin,

3
E il primo elifdovrebbe essere un if. Il codice semplicemente non dà l'impressione che tu sappia cosa stai facendo.
John Machin,

questo è un cattivo esempio
Patrick,

0

continue salta semplicemente il resto del codice nel ciclo fino alla successiva iterazione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.