2010-07-21 10 views
6

El siguiente código python dará como resultado que se imprima n (14), ya que el ciclo for se ha completado.Opuesto a Python para ... else

for n in range(15): 
    if n == 100: 
     break 
else: 
    print(n) 

Sin embargo, lo que quiero es lo contrario de esto. ¿Hay alguna manera de hacer un ciclo para ... else (o mientras ... else), pero solo ejecute el código else si el ciclo hizo ruptura?

+0

Demasiado cansado para escribir una solución atm pero utilizando contextmanagers podría ser una soluc (tal vez más tarde!) ¡ion! La fuente de inspiración podría estar aquí: http://stackoverflow.com/a/3171971/1524913 – JeromeJ

Respuesta

16

No hay for...elseifbreak explícita -como construir en Python (o en cualquier idioma, que yo sepa), ya que simplemente puede hacer esto:

for n in range(15): 
    if n == 100: 
     print(n) 
     break 

Si tiene varios break s, puesto print(n) en una función para que Don't Repeat Yourself.

+0

Seguramente no es lo que el operador quería? –

+4

¿por qué no? tiene el mismo efecto. Si quiere que el código se ejecute cuando encuentre una instrucción 'break', entonces simplemente ... ejecute el código antes de la declaración de interrupción –

+0

No he visto construcciones así per se, pero siempre puede usar \ * shudders \ *' goto' – NullUserException

6

Un poco solución más genérica el uso de excepciones en caso de que usted se rompe en múltiples puntos en el bucle y no desea duplicar código:

try: 
    for n in range(15): 
     if n == 10: 
      n = 1200 
      raise StopIteration() 
     if n > 4: 
      n = 1400 
      raise StopIteration() 
except StopIteration: 
    print n 
4

que no me gusta mucho las respuestas publicadas hasta ahora, como todos requieren que se cambie el cuerpo del bucle, lo que puede ser molesto/arriesgado si el cuerpo es realmente complicado, así que aquí hay una manera de hacerlo usando una bandera. _break reemplazar con found o algo más significativo para su caso de uso

_break = True 
for n in range(15): 
    if n == 100: 
     break 
else: 
    _break = False 

if _break: 
    print(n) 

Otra posibilidad si se trata de una función que no hace nada si el bucle no se encuentra una coincidencia, es return en el bloque else:

for n in range(15): 
    if n == 100: 
     break 
else: 
    return 
print(n) 
0

¿qué tal:

for n in range(15): 
    if n == 100: 
     break 
else: 
    print("loop successful") 
if n != range(15)[-1]: 
    print("loop failed") 
+0

Esto da el resultado incorrecto si el 'break 'ocurre en la última iteración del bucle. Imprimirá _ tanto "bucle exitoso" como "bucle fallido" en ese caso. –