2008-12-15 16 views
7

Escribí un while loop en una función, pero no sé cómo detenerlo. Cuando no cumple con su condición final, el ciclo solo dura para siempre. ¿Cómo puedo detenerlo?¿Cómo puedo detener un ciclo While?

def determine_period(universe_array): 
    period=0 
    tmp=universe_array 
    while True: 
     tmp=apply_rules(tmp)#aplly_rules is a another function 
     period+=1 
     if numpy.array_equal(tmp,universe_array) is True: 
      break #i want the loop to stop and return 0 if the 
        #period is bigger than 12 
     if period>12: #i wrote this line to stop it..but seems it 
         #doesnt work....help.. 
      return 0 
     else: 
      return period 
+2

el problema está en su pregunta. "cuando no cumple con su condición final ...". No está probando una condición final, está diciendo "mientras es verdadero". Verdadero siempre será Verdadero. –

+0

gracias por su comentario, sólo alrededor de la mitad sabe sobre loop..so mientras que no sé realmente cómo pedir una buena pregunta .. – NONEenglisher

Respuesta

12

simplemente mella su código correctamente:

def determine_period(universe_array): 
    period=0 
    tmp=universe_array 
    while True: 
     tmp=apply_rules(tmp)#aplly_rules is a another function 
     period+=1 
     if numpy.array_equal(tmp,universe_array) is True: 
      return period 
     if period>12: #i wrote this line to stop it..but seems its doesnt work....help.. 
      return 0 
     else: 
      return period 

Es necesario comprender que la declaración break en su ejemplo saldrá del bucle infinito que ha creado con while True. Por lo tanto, cuando la condición de corte es Verdadera, el programa saldrá del ciclo infinito y continuará hasta el siguiente bloque sangrado. Como no hay un bloque siguiente en su código, la función finaliza y no devuelve nada. Así que he reparado su código reemplazando la declaración break por una declaración return.

Siguiendo su idea de utilizar un bucle infinito, esta es la mejor manera de escribirlo:

def determine_period(universe_array): 
    period=0 
    tmp=universe_array 
    while True: 
     tmp=apply_rules(tmp)#aplly_rules is a another function 
     period+=1 
     if numpy.array_equal(tmp,universe_array) is True: 
      break 
     if period>12: #i wrote this line to stop it..but seems its doesnt work....help.. 
      period = 0 
      break 

    return period 
+0

i intentado esto como well.but que da hacia fuera mal rusult ... – NONEenglisher

+0

sí, porque tenían Otro error en tu código: una declaración de interrupción que impedía que tu función devolviera algo. Lo eliminé ahora. – Mapad

+0

..still, siempre devuelve 1 – NONEenglisher

8
def determine_period(universe_array): 
    period=0 
    tmp=universe_array 
    while period<12: 
     tmp=apply_rules(tmp)#aplly_rules is a another function 
     if numpy.array_equal(tmp,universe_array) is True: 
      break 
     period+=1 

    return period 
+0

1 pero sería bueno señalar lo + por qué 'mientras que la verdadera' eeek – annakata

+0

no funciona .... volver reslut..always equivocadas regresan 13 – NONEenglisher

+0

Joel bucle de código hasta período es 12 que dejar de bucle y el período de retorno ... es normal ... el código de Joel no es lo que quieres –

2

El operador is en Python, probablemente, no hace lo que usted espera. En lugar de esto:

if numpy.array_equal(tmp,universe_array) is True: 
     break 

lo escribiría así:

if numpy.array_equal(tmp,universe_array): 
     break 

Las pruebas is objeto operador identidad, que es algo muy diferente de la igualdad.

0

lo haría utilizando un bucle como se muestra a continuación:

def determine_period(universe_array): 
    tmp = universe_array 
    for period in xrange(1, 13): 
     tmp = apply_rules(tmp) 
     if numpy.array_equal(tmp, universe_array): 
      return period 
    return 0 
Cuestiones relacionadas