7
votes

Pourquoi sinon se comporte-t-il différemment pour / pendant que des déclarations par opposition à si / essayez des déclarations?

J'ai récemment trébuché sur une incohérence semblable à la manière de faire face aux clauses d'autre dans différentes déclarations composées. Puisque Python est si bien conçu, je suis sûr qu'il y a une bonne explication, mais je ne peux pas y penser.

Considérez les suivants: P>

for i in some_iterator:
   print(i)
else:
   print("Iterator is empty!")


2 commentaires

Je suis surpris Python permet la syntaxe. Dans la plupart des autres langues, il est limité à être utilisé uniquement avec des déclarations IF- ou Switch. Pour les boucles et les déclarations d'essai pourraient contrôler le flux, mais ils ne sont pas conditionnels comme une déclaration IF -ELSE, la sorte n'a donc aucune place.


Pour ce que cela vaut, il y a eu une récente discussion sur la longue discussion sur la liste des idées Python et al, résumée ici: article.gmane.org/gmane.comp.python.ideas/6131 . Guido lui-même admet avoir une deuxième réflexion à ce sujet: article.gmane.org/gmane .comp.python.ideas / 6133


3 Réponses :


13
votes

Le pour sinon code> construction exécute la clause el / code> si aucun casse code> est exécuté pour la boucle, comme décrit ici par exemple, cette clause d'autre n'est jamais évaluée

for i in range(1,10):
    if i % 5 == 0:
       print i
       break
else:
    print "nothing divisible by 5"


1 commentaires

Droite, donc une déclaration pour / tandis que - else n'a de sens que s'il y a une déclaration de pause quelque part.



4
votes

Oui, comme l'a mentionné Eli, la clause de l'autre n'est exécutée que si vous ne cassez pas. Il vous empêche de mettre en œuvre du code comme celui-ci:

for i in range(1,10):
    if i % 5 == 0:
       print i
       break
if i % 5 != 0:
   print "nothing divisible by 5"


0 commentaires

5
votes

Eh bien, cela dépend de la façon dont vous le voyez. Vous pouvez regarder les études telles que celles-ci (excusez-la, c'est le seul moyen de mettre l'accent sur le code):

if condition:
   do_something()
elif otherconditaion:
   do_anotherthing()
IF NO CONDITION WAS TRUE:
   do_something_else()


1 commentaires

Merci. Cela a du sens et répond à ma question.