2012-01-27 14 views

Respuesta

32

No, no hay anidada break declaración en Python.

su lugar, puede simplificar su función, así:

import itertools 
for i,j in itertools.product(range(1, 100), repeat=2): 
    break 

.. o poner el código en su propia función, y utilizar return:

def _helper(): 
    for i in range(1,100): 
     for j in range(1,100): 
      return 
_helper() 

.. o utilizar una excepción :

class BreakAllTheLoops(BaseException): pass 
try: 
    for i in range(1,100): 
     for j in range(1,100): 
      raise BreakAllTheLoops() 
except BreakAllTheLoops: 
    pass 

.. o el uso para-otro-continuar:

for i in range(1,100): 
    for j in range(1,100): 
     break 
    else: 
     continue 
    break 

.. o utilizar una variable bandera:

exitFlag = False 
for i in range(1,100): 
    for j in range(1,100): 
     exitFlag = True 
     break 
    if exitFlag: 
     break 
+0

Otra opción que falta, la [for/else/continue] (http://stackoverflow.com/a/3150107/505154). –

+0

@ F.J Agregado, gracias. Me preocupa un poco la duplicación, pero esta pregunta parece más fácil de leer que la anterior. – phihag

2

no No se puede especificar el número de bucles se rompa. Ponga su código en una función y use return.

1

Otra opción: utilizar una variable debandera en el bucle interno y ponerlo a True cuando se utiliza break. Luego úsela para break en el bucle externo. Se propusieron

1
for i in range(1,100): 
    breaking = false 
    for j in range(1,100): 
     if foundAReasonToBreak: 
      breaking = true 
      break 
    if breaking: 
     break 
4

varias soluciones en PEP 3136, pero el BDFL rejected it:

estoy rechazarla sobre la base de que el código tan complicado de esta característica requiere es muy raro. En la mayoría de los casos, existen soluciones temporales que producen código limpio, por ejemplo, usando 'return'. Aunque estoy seguro de hay algunos (raros) casos reales donde la claridad del código sería sufrir de una refactorización que hace posible el uso de retorno, esto se compensa con dos cuestiones:

  1. La complejidad agregado al lenguaje, permanentemente. Esto afecta no solo a todas las implementaciones de Python, sino también a todas las herramientas de análisis de fuentes, además de toda la documentación del lenguaje.

  2. Mi expectativa de que la característica se abusará más de lo que se utilizará correctamente, lo que lleva a una disminución neta en la claridad del código (medida en todos los códigos Python escritos a partir de ahora). Los programadores perezosos están en todas partes, y antes de que te des cuenta tienes un desorden increíble en tus manos del código ininteligible .

1
try: 
    for i in range(1,10): 
     print i 
     for j in range(1,10): 
      if j == 5: raise AssertionError 
      print j 
except AssertionError: 
    pass 

print "I'm free" 

Esto es un poco desagradable pero parece lograr lo que estás pidiendo.

Editar: Veo que @phihag publicó algo similar a como estaba experimentando.

+2

No utilice excepciones existentes para casos que no son los mismos para los que se diseñó originalmente la excepción. Crea tu propio. – Marian

Cuestiones relacionadas