Comment puis-je donner du sens de l ` "autre" clause de Python boucles?

De nombreux Python pour les programmeurs sont probablement pas au courant que la syntaxe de while boucles et for boucles comprend une option de else: clause:

for val in iterable:
    do_something(val)
else:
    clean_up()

Le corps de la else clause est une bonne place pour certains types de nettoyage des actions, et est exécuté sur l'arrêt normal de la boucle: I. e., la sortie de la boucle avec return ou break ignore le else clause; quitter après un continue l'exécute. Je sais ce que parce que je viens de regardé (encore une fois), parce que je ne me souviens jamais quand la else clause est exécutée.

Toujours? Sur "l'échec" de la boucle, comme le nom le suggère? Régulière de la résiliation? Même si la boucle est sortie avec return? Je ne pouvez jamais être certain que sans le regarder.

Je blâme mon persistance de l'incertitude sur le choix du mot-clé: je trouve else incroyablement unmnemonic pour cette sémantique. Ma question n'est pas "pourquoi est-ce le mot-clé utilisé à cette fin" (ce qui je ne serais probablement voter pour le fermer, mais seulement après avoir lu les réponses et les commentaires), mais comment puis-je penser à la else mot-clé, de sorte que sa sémantique logique, et je peut donc s'en souvenir?

Je suis sûr qu'il y a une bonne quantité de discussion à ce sujet, et je peux imaginer que le choix a été fait pour des raisons de cohérence avec le try de l'instruction else: de l'alinéa (que j'ai aussi de regarder en haut), et avec l'objectif de ne pas ajouter à la liste de Python mots réservés. Peut-être les raisons du choix de else permettra de clarifier sa fonction et de le rendre plus mémorable, mais je suis après le raccordement du nom de la fonction, non pas après une explication historique en soi.

Les réponses à cette question, qui à ma question a été brièvement fermé comme un doublon, contiennent beaucoup d'histoire. Ma question a un accent différent (comment connecter la une sémantique spécifique de else avec le mot-clé le choix), mais je pense qu'il devrait y avoir un lien à cette question quelque part.

  • Comment au sujet de "si il y a quelque chose à gauche pour effectuer une itération d'autre..."
  • Wow, ça a été rapide. Le focus de la question est à peu près ce que je ne voulais pas demander, comme je l'explique dans ma question), mais je vais prendre "si trouvé ... sinon:" comme une interprétation.
  • c'est sans doute proche de la marque, mais ça va être une mauvaise chose si la boucle est en train de vérifier pour les expressions du FOLKLORE en le comparant à une chaîne vide (comme beaucoup le font).
  • Je pense que vous vous en souvenez maintenant, après l'écriture de cette question 🙂
  • Je pensais la même chose! 🙂 Je vais le savoir dans une couple de semaines, je suppose...
  • pourquoi voudriez-vous rappelez-vous un difficile à retenir, caractéristique rare si vous pouvez google en 10 secondes?
  • le else qui signifie en gros, "si la poursuite de la condition d'échec". Dans un cadre traditionnel pour la boucle, la poursuite de la condition est généralement i < 42, dans ce cas, vous pouvez voir que la partie que if i < 42; execute the loop body; else; do that other thing
  • C'est tout à fait vrai, et j'aime particulièrement drawoc réponse, mais une autre chose à considérer est que else est une clé qui le rend aussi un peu de bon sens syntaxically. Vous savez peut-être essayer/sauf peut-être essayer/sauf/enfin, mais il a également else - exécuter ce code si aucune exception n'est arrivé. Qui est btw, pas la même chose que de bousculer ce code sous le coup d'essayer clause - la gestion des exceptions est meilleure si étroitement ciblée. Donc, si elle n'est conceptuel de sens que par un certain nombre de réponses ici - je pense que c'est le mot clé de la réutilisation à jouer trop exécuter ce sous certaines conditions.
  • Mon esprit est soufflé par ce parce que j'ai souvent voulu cela pour le reste de construire en Java. Maintenant je trouver qu'il existe déjà, avec la sémantique exacte j'ai toujours voulu, mais en Python? Et c'est exactement le genre de gentil, mais en fin de compte inutile truc que la conception par le comité de langues comme Java ne sera jamais ajouter. Oh bien.
  • Je crois me souvenir que Perl a aussi quelque chose comme ça. Les mêmes mots-clés utilisés pour modifier une boucle for dans le corps (continuer, pause), sont également utilisés pour le suffixe consolidés. Je ne me souviens pas des détails seulement que c'est différent de la façon dont les mots clés sont utilisés dans C.
  • cela pourrait être: Comme je l'ai depuis découvert, "le pour/le reste de construire a été conçu par Donald Knuth comme un remplacement pour certaines goto.. Knuth utilisé else, et il fait sens à la fois en raison de la façon dont le bouclage a été fait avant que la boucle de contrôle des états.
  • Mais peut-être que vous êtes en train de penser de perl postfix if, qui peut aller après quelque chose, par exemple break if $var;, print "Found it!" if $found;, etc.
  • Non, ce n'est pas ce à quoi je pensais. Voir ici.
  • Hmm, je ne pense pas que je savais à propos de cette fonctionnalité particulière (il semble que la date à partir de 2011). Il est différent de break, comme il est exécuté à plusieurs reprises. Pourtant, une autre extension classique de boucles, et probablement destiné à l'oubli comme les autres... (Guido mentionnés que s'il avait à refaire, il ne serait pas fournir la boucle-d'autre fonctionnalité en python sous n'importe quel nom.)
  • pardon pour mon (probablement stupide) de la question, mais comment exactement de la fonctionnalité utile à tous? N'est-ce pas for val in iterable: { do_something(val) } else: { clean_up() } exactement le même que for val in iterable: { do_something(val) } clean_up() (j'ai dû mettre des accolades à la place des sauts de ligne, parce que je ne sais pas comment les ajouter dans un commentaire)
  • il y a une différence lorsque le code est fermé par break. L'canonique de cas d'utilisation, c'est quand la boucle recherches pour quelque chose, et se casse quand il le trouve. Le else n'est exécutée que si rien n'est trouvé.
  • Très pertinent: python-notes.curiousefficiency.org/en/latest/python_concepts/...

InformationsquelleAutor alexis | 2016-06-05