Quería saber si hay formas integradas de continuar con la próxima iteración en el bucle externo en Python. Por ejemplo, considere el código:
for ii in range(200):
for jj in range(200, 400):
...block0...
if something:
continue
...block1...
Quiero que esta declaración de continuación salga del bucle jj y pase al siguiente elemento en el bucle ii. Puedo implementar esta lógica de alguna otra manera (estableciendo una variable de marca), pero ¿hay una manera fácil de hacer esto, o es como pedir demasiado?
Respuestas:
En un caso general, cuando tiene múltiples niveles de bucle y
break
no funciona para usted (porque desea continuar uno de los bucles superiores, no el que está justo encima del actual), puede hacer uno de los siguientesRefactorice los bucles de los que desea escapar a una función
La desventaja es que es posible que deba pasar a esa nueva función algunas variables, que anteriormente estaban en el alcance. Puede pasarlos como parámetros, convertirlos en variables de instancia en un objeto (crear un nuevo objeto solo para esta función, si tiene sentido) o variables globales, singletons, lo que sea (ehm, ehm).
O puede definir
inner
como una función anidada y dejar que solo capture lo que necesita (¿puede ser más lento?)Use excepciones
Filosóficamente, esto es para lo que se hacen excepciones, rompiendo el flujo del programa a través de los bloques de construcción de la programación estructurada (si es, por, mientras) cuando sea necesario.
La ventaja es que no tiene que dividir el código único en varias partes. Esto es bueno si es algún tipo de cálculo que está diseñando mientras lo escribe en Python. Introducir abstracciones en este punto temprano puede ralentizarlo.
Lo malo de este enfoque es que los autores de intérpretes / compiladores generalmente asumen que las excepciones son excepcionales y las optimizan en consecuencia.
Cree una clase de excepción especial para esto, de modo que no corra el riesgo de silenciar accidentalmente alguna otra excepción.
Algo completamente diferente
Estoy seguro de que todavía hay otras soluciones.
fuente
Break
romperá el bucle interno y block1 no se ejecutará (solo se ejecutará si el bucle interno sale normalmente).fuente
for...else
A menudo es una construcción útil, aunque puede ser confusa. Solo recuerde queelse
significa "sin descanso" en este contexto.En otros idiomas, puede etiquetar el bucle y separarse del bucle etiquetado. La Propuesta de Mejora de Python (PEP) 3136 sugirió agregar estos a Python pero Guido lo rechazó :
Entonces, si eso es lo que esperabas, no tienes suerte, pero mira una de las otras respuestas, ya que hay buenas opciones allí.
fuente
for-else
es más complicado, más difícil de leer y probablemente más abusado (si no es un error absoluto) de lo que serían los bucles con nombre. Creo que hubiera usado una palabra clave diferente queelse
, ¿tal vez algo asíresume
hubiera sido bueno? ¿Estásbreak
en el circuito yresume
está justo después?Creo que podrías hacer algo como esto:
fuente
for
,else
antes (y creo que incluso la mayoría de las personas que tienen no pueden recordar de la parte superior de su cabeza cómo funciona).Creo que una de las formas más fáciles de lograr esto es reemplazar la declaración "continuar" con "romper", es decir
Por ejemplo, aquí está el código fácil para ver cómo funciona exactamente:
fuente
Otra forma de lidiar con este tipo de problema es usar Exception ().
Por ejemplo:
resultado:
Suponiendo que queremos saltar al bucle n externo desde el bucle m si m = 3:
resultado:
Enlace de referencia: http://www.programming-idioms.org/idiom/42/continue-outer-loop/1264/python
fuente
Queremos encontrar algo y luego detener la iteración interna. Yo uso un sistema de bandera.
fuente
False:continue
cosa es ... un formato inusual. Como suele ser el caso en los sistemas "naturales" donde la norma es exponencial, solo tienes que tener suerte unas pocas veces en SO para acumular una cantidad significativa de puntos de reputación. De todos modos, mis "mejores" respuestas suelen ser las menos populares.Acabo de hacer algo como esto. Mi solución para esto fue reemplazar el interior por el bucle con una lista de comprensión.
donde op es un operador booleano que actúa sobre una combinación de ii y jj. En mi caso, si alguna de las operaciones devuelve verdadero, ya estaba hecho.
Esto realmente no es tan diferente de dividir el código en una función, pero pensé que usar el operador "any" para hacer un OR lógico en una lista de booleanos y hacer la lógica todo en una línea era interesante. También evita la llamada a la función.
fuente