Ejemplo de uso de la declaración "continuar" en Python?


177

La definición de la continuedeclaración es:

La continuedeclaración continúa con la próxima iteración del bucle.

No puedo encontrar ningún buen ejemplo de código.

¿Podría alguien sugerir algunos casos simples donde continuesea ​​necesario?

Respuestas:


218

Aquí hay un ejemplo simple:

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

La salida será:

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

Continúa a la siguiente iteración del bucle.


1
He estado pensando durante los últimos tres o cuatro días, ¿por qué necesitaría alguna vez una declaración de 'continuar' y luego me encuentro con esta publicación que a su vez me ayuda con algo de control de calidad? ¡Muchas gracias!
Freddy

3
lo mismo aquí, cuando escribimos el script python (para el trabajo cron) e iteramos en valores grandes y se produce alguna excepción, entonces el trabajo cron se detendrá y solo podrá saber que al día siguiente, realmente ayuda mucho en ese caso, sí podemos escribir la función de envío de correo con excepción, pero la ejecución se detendrá.
Snehal Parmar

2
Esto ilustra lo que continuehace, pero no es demasiado útil, cuando podría hacerloif letter != 'D': print 'Current Letter:', letter
Chris_Rands

Hubiera elegido Pray / remove r, o Fast / remove s.
Benjamin Crouzier

102

Me gusta usar continuar en bucles donde hay muchas condiciones que deben cumplirse antes de "ponerse manos a la obra". Entonces, en lugar de un código como este:

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

Me sale un código como este:

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

Al hacerlo de esta manera evito el código muy anidado. Además, es fácil optimizar el ciclo eliminando primero los casos más frecuentes, de modo que solo tengo que tratar los casos poco frecuentes pero importantes (por ejemplo, el divisor es 0) cuando no hay otro showtopper.


2
Así que "continuar" se usa principalmente para facilitar la lectura al reducir la sangría. Me pregunto si "continuar" agrega algún poder expresivo.
JohnG

14
Usar continuede esta manera es similar a usar GOTO. Sin embargo, esta es la forma correcta de usar GOTO.
dotancohen

1
@JohnG No creo que haya ningún uso de continuar (o interrumpir, para el caso) que no se pueda reproducir sin él, aunque no tenerlo puede ser costoso en tiempo de ejecución.
Sparr

18

Por lo general, la situación en la que continuar es necesario / útil es cuando desea omitir el código restante en el ciclo y continuar la iteración.

Realmente no creo que sea necesario, ya que siempre puedes usar sentencias if para proporcionar la misma lógica, pero podría ser útil para aumentar la legibilidad del código.


23
tenga en cuenta que usar en if <condition>: continuelugar de if not <condition>: ...evitar un nivel de sangría que de otro modo sería necesario si se escribiera sin él.
Dan D.

1
Estaba a punto de publicar un qn similar a JohnG, pero luego descubrí que ya me había preguntado lo que quería saber. Leer todas las respuestas aquí ha ayudado, pero todavía necesito estar seguro de una cosa: entonces, cuando usamos una continuedeclaración, esencialmente estamos saltando de una sección de prueba condicional y permitiendo que la iteración del ciclo continúe a la siguiente iteración? No es evidente para mí cómo esto sería mejor que usarlo else. ¿Se trata solo de mejorar la legibilidad y el rendimiento en tiempo de ejecución?
AKKO

"No creo que sea necesario" ... bueno, los creadores de Python pensaron lo contrario.
Jean-François Fabre

12
import random  

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

continuar es una declaración de control extremadamente importante. El código anterior indica una aplicación típica, donde se puede evitar el resultado de una división por cero. Lo uso a menudo cuando necesito almacenar la salida de los programas, pero no quiero almacenar la salida si el programa se ha bloqueado. Tenga en cuenta que para probar el ejemplo anterior, reemplace la última instrucción con print 1 / float (x), o obtendrá ceros cada vez que haya una fracción, ya que randint devuelve un entero. Lo omití por claridad.


10

Algunas personas han comentado sobre la legibilidad, diciendo: "Oh, no ayuda tanto la legibilidad, ¿a quién le importa?"

Suponga que necesita una verificación antes del código principal:

if precondition_fails(message): continue

''' main code here '''

Tenga en cuenta que puede hacer esto después se haya escrito el código principal sin cambiar ese código de ninguna manera. Si difunde el código, solo se resaltará la línea agregada con "continuar", ya que no hay cambios de espacio en el código principal.

Imagínese si tiene que hacer un desayuno de código de producción, que resulta simplemente agregar una línea con continuar. Es fácil ver que ese es el único cambio cuando revisas el código. Si comienza a ajustar el código principal en if / else, diff resaltará el código recién sangrado, a menos que ignore los cambios de espacio, lo cual es peligroso particularmente en Python. Creo que a menos que haya estado en la situación en la que tiene que implementar el código a corto plazo, es posible que no lo aprecie completamente.


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

44
Pero, ¿qué agrega la continuedeclaración aquí? Podría eliminarse mediante el uso , y el código sería igual de legible. element not in colors
ekhumoro

4

Digamos que queremos imprimir todos los números que no son múltiplos de 3 y 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

También puede simplemente usar if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Comodín

La forma correcta es utilizar continuar o no el operador. ¿Por qué utilizar innecesariamente pase?
ytpillai

Me gusta más tu camino (de ahí el voto positivo). Llegué a esta página tratando de resolver si alguna vez es necesario usarla continue. Mi conclusión es que nunca hay una necesidad , pero en algunos casos (como este) el código es más fácil de usar continue. Es un muy buen ejemplo.
Comodín

3

No es absolutamente necesario, ya que se puede hacer con IF, pero es más legible y también menos costoso en tiempo de ejecución.

Lo uso para omitir una iteración en un bucle si los datos no cumplen algunos requisitos:

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

Salida:

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

Como puede ver, el valor incorrecto no apareció después de la continuedeclaración.


ifsolo puede hacer lo que continuehace si todo el código está contenido en un bloque. continueomite el código que está incluso fuera del ifbloque.
bryc

¿Por qué la hora incluye 24 horas , pero el minuto es exclusivo 60?
Patrick Artner

ninguna razón en particular, solo un ejemplo, siéntase libre de editar
Bastian

1

Por ejemplo, si desea hacer diferentes cosas según el valor de una variable:

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

En el ejemplo anterior, si uso breakel intérprete se saltará el bucle. Pero con continueesto solo se saltan las declaraciones if-elif e ir directamente al siguiente elemento del ciclo.


3
su ejemplo nunca imprimirá nada, ya que la primera condición siempre es cierta. asumiendo un valor inicial para my_varde 0.
Dan D.

Simplemente adapté un ejemplo de un antiguo código mío. El valor original de la var no es 0 y la parte creciente se agregó por conveniencia ya que su lugar original no estaba allí. Dado que es un ejemplo y su valor realmente no importa, supongo que está bien.
jonathan.hepp

9
No está bien. No es un buen anuncio para usar continue.
John Machin

3
Y el primero elifdebería ser un if. El código simplemente no da la apariencia de que sabes lo que estás haciendo.
John Machin

este es un mal ejemplo
patrick

0

continue simplemente omite el resto del código en el ciclo hasta la próxima iteración

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.