Je voulais savoir s'il existe des moyens intégrés pour continuer à l'itération suivante dans la boucle externe en python. Par exemple, considérez le code:
for ii in range(200):
for jj in range(200, 400):
...block0...
if something:
continue
...block1...
Je veux que cette instruction continue quitte la boucle jj et passe à l'élément suivant de la boucle ii. Je peux implémenter cette logique d'une autre manière (en définissant une variable d'indicateur), mais y a-t-il un moyen facile de le faire, ou est-ce comme demander trop?
Réponses:
Dans un cas général, lorsque vous avez plusieurs niveaux de bouclage et
break
cela ne fonctionne pas pour vous (parce que vous voulez continuer une des boucles supérieures, pas celle juste au-dessus de la boucle actuelle), vous pouvez effectuer l'une des opérations suivantesRefactoriser les boucles dont vous souhaitez vous échapper dans une fonction
L'inconvénient est que vous devrez peut-être passer à cette nouvelle fonction certaines variables, qui étaient auparavant dans la portée. Vous pouvez soit simplement les passer en tant que paramètres, en faire des variables d'instance sur un objet (créer un nouvel objet juste pour cette fonction, si cela a du sens), ou des variables globales, des singletons, peu importe (ehm, ehm).
Ou vous pouvez définir
inner
comme fonction imbriquée et la laisser capturer simplement ce dont elle a besoin (peut-être plus lente?)Utiliser des exceptions
Philosophiquement, c'est à cela que servent les exceptions, interrompant le flux du programme à travers les blocs de construction de programmation structurée (si, pendant, pendant) lorsque cela est nécessaire.
L'avantage est que vous n'avez pas à diviser le morceau de code en plusieurs parties. C'est bien s'il s'agit d'une sorte de calcul que vous concevez en l'écrivant en Python. Introduire des abstractions à ce stade précoce peut vous ralentir.
La mauvaise chose avec cette approche est que les auteurs d'interprètes / compilateurs supposent généralement que les exceptions sont exceptionnelles et optimisées pour elles en conséquence.
Créez une classe d'exception spéciale pour cela, afin de ne pas risquer de faire taire accidentellement une autre exception.
Quelque chose d'autre entièrement
Je suis sûr qu'il existe encore d'autres solutions.
la source
Break
cassera la boucle interne, et block1 ne sera pas exécuté (il ne fonctionnera que si la boucle interne est quittée normalement).la source
for...else
est souvent une construction utile, même si elle peut prêter à confusion. N'oubliez pas que celaelse
signifie "pas de pause" dans ce contexte.Dans d'autres langues, vous pouvez étiqueter la boucle et sortir de la boucle étiquetée. La proposition d'amélioration de Python (PEP) 3136 a suggéré de les ajouter à Python mais Guido l'a rejetée :
Donc, si c'est ce que vous espériez, vous n'avez pas de chance, mais regardez l'une des autres réponses car il y a de bonnes options.
la source
for-else
est plus compliqué, plus difficile à lire et probablement plus abusé (sinon une erreur pure et simple) que ne le seraient les boucles nommées. Je pense que j'aurais utilisé un mot-clé différent deelse
- peut-être que quelque chose comme çaresume
aurait été bien? Vous êtesbreak
dans la boucle etresume
c'est juste après?Je pense que vous pourriez faire quelque chose comme ça:
la source
for
,else
avant (et je pense que même la plupart des gens qui ont ne me souviens pas du haut de leur tête la façon dont cela fonctionne).Je pense que l’un des moyens les plus simples d’y parvenir est de remplacer l’instruction «continuer» par «casser», c’est-à-dire
Par exemple, voici le code simple pour voir comment cela se passe exactement:
la source
Une autre façon de traiter ce genre de problème est d'utiliser Exception ().
Par exemple:
résultat:
En supposant que nous voulons sauter à la boucle n externe à partir de m boucle si m = 3:
résultat:
Lien de référence: http://www.programming-idioms.org/idiom/42/continue-outer-loop/1264/python
la source
Nous voulons trouver quelque chose puis arrêter l'itération interne. J'utilise un système de drapeau.
la source
False:continue
problème est ... un formatage inhabituel. Comme c'est souvent le cas dans les systèmes «naturels» où l'exponentielle est la norme, il suffit d'avoir de la chance quelques fois sur SO pour accumuler une quantité significative de points de réputation. Quoi qu'il en soit, mes «meilleures» réponses sont généralement les moins populaires.J'ai juste fait quelque chose comme ça. Ma solution pour cela était de remplacer la boucle for intérieure par une compréhension de liste.
où op est un opérateur booléen agissant sur une combinaison de ii et jj. Dans mon cas, si l'une des opérations retournait vraie, c'était terminé.
Ce n'est vraiment pas si différent de décomposer le code en une fonction, mais j'ai pensé qu'utiliser l'opérateur "any" pour faire un OU logique sur une liste de booléens et faire la logique en une seule ligne était intéressant. Cela évite également l'appel de fonction.
la source