romper y continuar en función

def funcA(i): if i%3==0: print "Oh! No!", print i break for i in range(100): funcA(i) print "Pass", print i 

Sé que el script de arriba no funcionará. Entonces, ¿cómo puedo escribir si necesito poner una función con break o continuar en un bucle?

Una función no puede causar una interrupción o continuar en el código desde el que se llama. El break / continue tiene que aparecer literalmente dentro del bucle. Sus opciones son:

  1. devuelva un valor desde funcA y utilícelo para decidir si romper
  2. genere una excepción en funcA y cójala en el código de llamada (o en algún lugar más arriba en la cadena de llamadas)
  3. escriba un generador que encapsule la lógica de ruptura y repita eso en lugar del range

Por # 3 me refiero a algo como esto:

 def gen(base): for item in base: if item%3 == 0: break yield i for i in gen(range(1, 100)): print "Pass," i 

Esto le permite poner la ruptura con la condición agrupándolos en un generador basado en el iterador “base” (en este caso, un rango). Luego, itera sobre este generador en lugar de sobre el mismo rango y obtiene el comportamiento de ruptura.

 def funcA(i): if i%3==0: print "Oh! No!", print i return True else: return False for i in range(100): if funcA(i): break print "Pass", print i 

La elaboración de la respuesta de BrenBarns: break afortunadamente no se propagará. break es romper el bucle de stream, punto. Si desea propagar un evento, debe raise una excepción. Sin embargo, boost la excepción para romper el bucle es una forma realmente fea de romper los bucles y una buena manera de romper tu código.

KISS ! Lo más simple sería verificar la condición directamente en el bucle.

 def my_condition(x): return x == 4 for i in xrange(100): if my_condition(i): break print i 

Si, por alguna razón, quiere propagar una excepción, entonces la usa así

 # exception example for i in xrange(100): if i == 4: raise Exception("Die!") print i 

Como se mencionó, es un diseño realmente feo . Imagina que olvidaste esta excepción, o cambias su tipo de Exception a MyBreakException y olvidas cambiarla en algún lugar en try/except la parte superior del código …

El ejemplo del generador tiene sus méritos, hace que su código sea más funcional (que presuntamente adoro)

 # generator example def conditional_generator(n, condition): for i in xrange(n): if condition(i): break else: yield i for i in conditional_generator( 100, my_condition ): print i 

… que es similar a takewhile , mencionado por eumiro

La ruptura no se propaga entre las funciones, debe colocarla directamente dentro del bucle en algún lugar.