J'ai remarqué que le code suivant est légal en Python. Ma question est pourquoi? Y a-t-il une raison précise?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
J'ai remarqué que le code suivant est légal en Python. Ma question est pourquoi? Y a-t-il une raison précise?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
else
pour cette utilisation avait été une très mauvaise idée, et qu'ils ne feraient plus cela.after:
.Réponses:
La
else
clause n'est exécutée que lorsque votrewhile
condition devient fausse. Si vousbreak
sortez de la boucle, ou si une exception est levée, elle ne sera pas exécutée.Une façon de penser est comme une construction if / else par rapport à la condition:
est analogue à la construction en boucle:
Un exemple pourrait être dans le sens de:
la source
while {} something
sauf que lesomething
sera ignoré si vous êtesbreak
dans lawhile
boucle.La
else
clause est exécutée si vous quittez un bloc normalement, en atteignant la condition de boucle ou en tombant du bas d'un bloc try. Il n'est pas exécuté si vousbreak
oureturn
hors d'un bloc, ou déclenchez une exception. Cela fonctionne non seulement pendant et pour les boucles, mais aussi pour les blocs.Vous le trouvez généralement dans des endroits où normalement vous quitteriez une boucle tôt, et courir à la fin de la boucle est une occasion inattendue / inhabituelle. Par exemple, si vous parcourez une liste à la recherche d'une valeur:
la source
found_it=False
au début d'une boucle, puis je fais un test sifound_it
à la finEn réponse à
Is there a specific reason?
, voici une application intéressante: sortir de plusieurs niveaux de bouclage.Voici comment cela fonctionne: la boucle externe a une coupure à la fin, donc elle ne serait exécutée qu'une seule fois. Cependant, si la boucle interne se termine (ne trouve aucun diviseur), alors elle atteint l'instruction else et la rupture externe n'est jamais atteinte. De cette façon, une coupure dans la boucle intérieure sortira des deux boucles, plutôt qu'une seule.
Pour les deux
while
et lesfor
boucles, l'else
instruction est exécutée à la fin, sauf si elle abreak
été utilisée.Dans la plupart des cas, il existe de meilleures façons de le faire (en l'enveloppant dans une fonction ou en levant une exception), mais cela fonctionne!
la source
La clause else est exécutée lorsque la condition while est évaluée à false.
De la documentation :
la source
Ma réponse se concentrera sur QUAND nous pouvons utiliser while / for-else.
À première vue, il ne semble pas y avoir de différence lors de l'utilisation
et
Parce que l'
print 'ELSE'
instruction semble toujours exécutée dans les deux cas (à la fois lorsque lawhile
boucle est terminée ou non).Ensuite, ce n'est différent que lorsque l'instruction
print 'ELSE'
ne sera pas exécutée. C'est quand il y a unbreak
bloc de code souswhile
Si différent de:
return
ne fait pas partie de cette catégorie, car elle fait le même effet dans deux cas ci-dessus.La levée d'exception ne provoque pas non plus de différence, car lorsqu'elle se déclenche, où le code suivant sera exécuté est dans le gestionnaire d'exceptions (sauf le bloc), le code dans la
else
clause ou juste après lawhile
clause ne sera pas exécuté.la source
Je sais que c'est une vieille question mais ...
Comme l'a dit Raymond Hettinger, il devrait être appelé à la
while/no_break
place dewhile/else
.Je trouve cela facile à comprendre et si vous regardez cet extrait.
Maintenant, au lieu de vérifier la condition après la boucle while, nous pouvons l'échanger
else
et nous débarrasser de ce contrôle.Je le lis toujours
while/no_break
pour comprendre le code et cette syntaxe a beaucoup plus de sens pour moi.la source
La clause else n'est exécutée que lorsque la condition while devient fausse.
Voici quelques exemples:
Exemple 1: Initialement, la condition est fausse, donc la clause else est exécutée.
PRODUCTION:
Exemple 2: La condition while
i < 5
n'est jamais devenue fausse car ellei == 3
rompt la boucle, donc la clause else n'a pas été exécutée.PRODUCTION:
Exemple 3: La condition while
i < 5
est devenue fausse quandi
was5
, donc la clause else a été exécutée.PRODUCTION:
la source
L'
else:
instruction est exécutée lorsque et seulement lorsque la boucle while ne remplit plus sa condition (dans votre exemple, quandn != 0
est false).Donc, la sortie serait la suivante:
la source
Sinon est exécuté si la boucle while ne s'est pas cassée.
J'aime un peu y penser avec une métaphore «coureur».
Le "sinon", c'est comme franchir la ligne d'arrivée, peu importe si vous avez commencé au début ou à la fin de la piste. "else" n'est pas exécuté uniquement si vous cassez quelque part entre les deux.
Les cas d'utilisation principaux utilisent cette rupture des boucles imbriquées ou si vous souhaitez exécuter certaines instructions uniquement si la boucle ne s'est pas interrompue quelque part (pensez que la rupture est une situation inhabituelle).
Par exemple, ce qui suit est un mécanisme sur la façon de sortir d'une boucle interne sans utiliser de variables ou essayer / attraper:
la source
La meilleure utilisation de la construction 'while: else:' en Python devrait être si aucune boucle n'est exécutée dans 'while' alors l'instruction 'else' est exécutée. La façon dont cela fonctionne aujourd'hui n'a pas de sens car vous pouvez utiliser le code ci-dessous avec les mêmes résultats ...
la source
else
bloc ne sera pas exécuté si vous quittez la boucle à l'aide debreak
ou dureturn
mot - clé. Dans votre exemple,print
sera également exécuté si la boucle s'est terminée surbreak
commande.Il est utile pour l'interaction sociale.
la source
else
ici? Le code fait exactement la même chose sans lui.break
pendant votre compte à rebours, ne pas utiliserelse
vous fera dire "Bonne année!" instantanément, ce qui n'a aucun sens.break
"? Il n'ybreak
en a pas dans le code.