2008-12-15 14 views
7

J'ai écrit un while loop dans une fonction, mais je ne sais pas comment l'arrêter. Quand il ne répond pas à sa condition finale, la boucle va juste pour toujours. Comment puis-je l'arrêter?Comment puis-je arrêter une boucle 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

le problème est dans votre question. "quand il ne répond pas à son état final ..". Vous n'êtes pas en train de tester une condition finale, vous dites "while true:". Vrai sera toujours vrai. –

+0

merci pour votre commentaire, j'ai à peu près la moitié connue sur while loop..so ne sais pas vraiment comment poser une bonne question .. – NONEenglisher

Répondre

12

indentent simplement votre code correctement:

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 

Vous devez comprendre que la déclaration break dans votre exemple sortir de la boucle infinie que vous avez créé avec while True. Ainsi, lorsque la condition de coupure est True, le programme quittera la boucle infinie et passera au bloc suivant en retrait. Comme il n'y a pas de bloc suivant dans votre code, la fonction se termine et ne retourne rien. J'ai donc corrigé votre code en remplaçant l'instruction break par une instruction return.

Suite à votre idée d'utiliser une boucle infinie, c'est la meilleure façon de l'écrire:

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

j'ai essayé cela aussi. Mais il donne faux rusult ... – NONEenglisher

+0

oui, parce que vous aviez un autre bug dans votre code: une instruction break qui empêchait votre fonction de retourner quelque chose. Je l'ai enlevé maintenant. – Mapad

+0

.. toujours, il retourne toujours 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 mais serait bien de souligner ce que + pourquoi," alors que vrai "eeek – annakata

+0

ne fonctionne pas .... retour mauvais reslut..toujours retour 13 – NONEenglisher

+0

Boucle de code Joel jusqu'à ce que la période est de 12 que d'arrêter la boucle et la période de retour ... c'est normal ... Le code de Joel n'est pas ce que vous voulez –

2

L'opérateur is en Python ne fait probablement pas ce que vous attendez. Au lieu de cela:

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

Je voudrais écrire comme ceci:

if numpy.array_equal(tmp,universe_array): 
     break 

Les is opérateur teste objet identité, ce qui est tout autre chose de l'égalité.

0

je le ferais en utilisant une boucle comme indiqué ci-dessous:

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