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
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
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
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é.
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