web-dev-qa-db-fra.com

Comment puis-je arrêter une boucle While?

J'ai écrit un while loop dans une fonction, mais je ne sais pas comment l'arrêter. Quand il ne remplit pas sa condition finale, la boucle continue pour toujours. Comment puis-je l'arrêter?

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
12
NONEenglisher

indentez juste 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 l'instruction break dans votre exemple quittera la boucle infinie que vous avez créée avec while True. Ainsi, lorsque la condition de rupture est True, le programme quitte la boucle infinie et passe au bloc indenté suivant. Puisqu'il n'y a pas de bloc suivant dans votre code, la fonction se termine et ne renvoie rien. J'ai donc corrigé votre code en remplaçant l'instruction break par une instruction return.

Suivant 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
17
Mapad
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
8
Joel Coehoorn

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

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

Je l'écrirais comme ceci:

    if numpy.array_equal(tmp,universe_array):
        break

L'opérateur is teste l'identité de l'objet, ce qui est très différent de l'égalité.

2
Greg Hewgill

Je le ferais en utilisant une boucle for 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
0
Suraj