D'autre clause sur Python, tandis que le rapport
J'ai remarqué que le code suivant est légal en Python. Ma question est pourquoi? Est-il une raison spécifique?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
- C'est parce que la plupart des gens évitent de cette construction. 🙂 Je crois que Guido mentionné au cours de la Py3k processus qui, à tout le moins, le choix du mot
else
pour cet usage avait été une très mauvaise idée, et qu'il ne serait pas faire plus de ceux-ci. - Chevalier - ouais, tentant quoiqu'il en soit, il serait probablement quelque chose que j'ai entendu le premier coup d'œil. Tout autre mauvais sap serait d'aller et de regarder la langue spec, ou remonter dans le temps et de poster une question ici, sur la Sta - heeeeey...
- Ce serait un meilleur mot que d'autre?
- Rien de vraiment, je ne pense pas que le binaire implication de "else" convient à une construction de boucle très bien.
- L'idée derrière le choix de 'else' est que cette construction soit disant est souvent utilisé en conjonction avec un 'si X: pause à l'intérieur de la boucle while. Depuis le 'else' clause est exécutée si nous ne brisons pas sortir de la boucle, il forme un peu-sorta 'else' le 'si'.
- Je suis tombé sur ce il y a quelques minutes, c'est ce que j'ai rassemblé.
- Ils devraient renommer
after:
. - Après n'est pas vraiment approprié, car il ne serait pas exécuter si vous avez utilisé "pause" ou "retour" pour quitter la boucle. Je dis toujours aux gens qui ont de la difficulté à se rappeler de l'utilisation, "Si vous êtes à la sortir de la boucle, vous avez la possibilité de faire quelque chose juste avant votre instruction break. Si vous êtes épuisant votre collection (dans une boucle for) ou de la rupture de votre condition de boucle (dans une boucle while), le 'else' clause est votre endroit pour conclure."
- Difficile de nom, mais si j'ai bien entendu, Raymond Hettinger suggéré
nobreak:
comme un nom ici (d'ailleurs, cela fonctionne aussi dansfor
boucles). - Double Possible de Pourquoi python utilisation 'd'autre' après les boucles for et while?
Vous devez vous connecter pour publier un commentaire.
La
else
clause n'est exécuté que lorsque votrewhile
condition devient fausse. Si vousbreak
hors de la boucle, ou si une exception est levée, elle ne sera pas exécutée.Une façon de penser, c'est comme si/d'autre de construire à l'égard de l'état:
est analogue à la construction de boucle:
Un exemple pourrait être le long des lignes de:
while {} something
sauf que lesomething
sera ignoré si vousbreak
dans lewhile
boucle.La
else
clause est exécuté si vous quittez un bloc normalement, en appuyant sur la condition de la boucle ou de tomber en bas d'un bloc try. Il est pas exécuté si vousbreak
oureturn
à partir d'un bloc, ou lever une exception. Il fonctionne non seulement pour les boucles while et for, mais aussi essayer de blocs.Vous trouvez généralement dans des endroits où normalement vous devez quitter une boucle au début, et l'extrémité de la boucle est un inattendu/insolite occasion. Par exemple, si vous êtes une boucle dans une liste de recherche d'une valeur:
En réponse à
Is there a specific reason?
, voici une application intéressante: la rupture de plusieurs niveaux de bouclage.Voici comment cela fonctionne: la boucle externe a une pause à la fin, donc, elle ne sera exécuté qu'une fois. Toutefois, si l'intérieur de la boucle complète (trouve pas de diviseur), alors qu'il atteint l'instruction else " et "extérieur" pause n'est jamais atteint. De cette façon, une pause dans la boucle intérieure va sortir de deux boucles, plutôt qu'une seule.
Pour les deux
while
etfor
boucles, leelse
instruction est exécutée à la fin, à moins quebreak
a été utilisé.Dans la plupart des cas, il ya de meilleures façons de le faire (en l'enveloppant dans une fonction ou le déclenchement d'une exception), mais cela fonctionne!
Le bloc else est exécutée lorsque la alors la condition est false.
De la la documentation:
Ma réponse va se concentrer sur QUAND on peut utiliser while/pour les autres.
Au premier coup d'œil, il semble qu'il n'est pas différent lors de l'utilisation de
et
Parce que le
print 'ELSE'
déclaration semble toujours exécutée dans les deux cas (à la fois lors de lawhile
boucle terminée ou pas).Puis, c'est seulement différente lorsque l'instruction
print 'ELSE'
ne sera pas exécuté.C'est quand il y a un
break
à l'intérieur du bloc de code souswhile
Si différents:
return
n'est pas dans cette catégorie, car il n'a le même effet pour les deux cas ci-dessus.exception soulever aussi ne cause pas de différence, parce que quand il soulève, d'où le code sera exécuté est dans le gestionnaire d'exception (sauf bloc), le code de la
else
clause ou à droite après lewhile
clause ne sera pas exécuté.Je sais que c'est une vieille question, mais...
Comme Raymond Hettinger dit, il doit être appelé
while/no_break
au lieu dewhile/else
.Je trouve facile de comprends si vous regardez cet extrait.
Maintenant, au lieu de la vérification de la condition après la boucle while, nous pouvons l'échanger avec
else
et de se débarrasser de cette vérification.J'ai toujours lu que
while/no_break
à comprendre le code et que la syntaxe fait beaucoup plus de sens pour moi.La
else:
instruction est exécutée lorsque et seulement lorsque la boucle while ne répond plus à son état (dans votre exemple, quandn != 0
est faux).De sorte que la sortie serait celui-ci:
Il est utile pour l'interaction sociale.
else
ici? Le code fait exactement la même sans elle.break
lors de votre compte à rebours, ne pas utiliserelse
fera de vous dire "bonne année!" instantanément, ce qui n'a pas de sens.break
"? Il n'y a pas debreak
dans le code.Else est exécutée si la boucle while ne pas casser.
J'aime un peu pour penser à lui avec un "coureur" de la métaphore.
Le "else", c'est comme franchir la ligne d'arrivée, sans importance de savoir si vous avez commencé au début ou à la fin de la piste. "else" n'est pas exécuté que si vous cassez quelque part entre les deux.
Principaux cas d'utilisation est l'utilisation de ce sortir de boucles imbriquées ou si vous souhaitez exécuter certaines instructions seulement si la boucle ne se sont pas cassé quelque part (pensez à la rupture étant une situation inhabituelle).
Par exemple, ce qui suit est un mécanisme sur la façon de sortir d'une boucle interne, sans l'aide de variables ou de try/catch:
La meilleure utilisation de tout: autre: "construction en Python devrait être le cas si aucune boucle est exécutée dans 'tout' le 'else' instruction est exécutée. La façon dont il fonctionne aujourd'hui, ne fait pas de sens parce que vous pouvez utiliser le code ci-dessous avec les mêmes résultats...
else
bloc ne sera pas exécuté si vous êtes sortant de la boucle à l'aide debreak
oureturn
mot-clé. Dans votre exemple,print
sera exécuté également si la boucle s'est terminée surbreak
de commande.