Python: la Poursuite de la prochaine itération dans la boucle externe
Je voulais savoir si il y a tout intégré dans les moyens de continuer à la prochaine itération 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 pour quitter le jj boucle et goto élément suivant dans la partie ii de la boucle. Je peux mettre en œuvre cette logique d'une autre façon (par la définition d'une variable d'indicateur), mais est-il un moyen facile de faire cela, ou est-ce trop demander?
- Il existe réellement un travail instruction goto pour Python: entrian.com/goto. Il a été libéré comme un poisson d'avril :-), mais est censé fonctionner.
- Oh, s'il vous plaît ne pas l'utiliser goto blague! Il est remarquablement intelligent, mais vous serez triste, plus tard, si vous le mettez dans votre code.
Vous devez vous connecter pour publier un commentaire.
Dans un cas général, lorsque vous avez plusieurs niveaux de lecture en boucle et
break
ne fonctionne pas pour vous (parce que vous souhaitez continuer à l'une de la partie supérieure de boucles, pas celui qui est juste au-dessus de celui en cours), vous pouvez effectuer l'une des opérations suivantesRefactoriser les boucles que vous voulez échapper dans une fonction
L'inconvénient est que vous devrez peut-être passer à cette nouvelle fonction de certaines variables, qui étaient auparavant dans la portée. Vous pouvez soit passer comme paramètres, de les rendre variables d'instance d'un objet (créer un nouvel objet juste pour cette fonction, si elle fait sens), ou des variables globales, les singletons, quoi (euh, euh).
Ou vous pouvez définir
inner
comme une fonction imbriquée et laissez simplement capturer ce dont il a besoin (peut-être plus lent?)Utiliser les exceptions
Philosophiquement, c'est ce que font exception, brisant le déroulement du programme, par le biais de la programmation structurée blocs de construction (if, for, while) lorsque cela est nécessaire.
L'avantage est que vous n'avez pas à briser le seul morceau de code en plusieurs parties. C'est bon si c'est une sorte de calcul que vous êtes à la conception de tout écrit en Python. L'introduction des abstractions à ce stade précoce peut vous ralentir.
Mauvaise chose avec cette approche est que l'interpréteur/compilateur auteurs postulent que les exceptions sont exceptionnelles et d'optimiser en conséquence.
Créer une exception de classe pour cela, de sorte que vous ne risquez pas accidentellement taire certaines autres exceptions.
Quelque chose d'autre entièrement
Je suis sûr qu'il existe encore d'autres solutions.
Break
va casser la boucle interne, et bloc1 ne sera pas exécutée (il sera exécuté que si la boucle intérieure est sorti normalement).for...else
est souvent utile de construire, même si elle peut être source de confusion. Rappelez-vous juste queelse
signifie "pas de rupture" dans ce contexte.Dans d'autres langues vous pouvez étiquette de la boucle et de la pause de la étiquetés de la boucle. Python Amélioration de la Proposition (PEP) 3136 a suggéré d'ajouter ces Python mais Guido rejeté:
Donc si c'est ce que vous espériez, vous êtes hors de la chance, mais regardez l'une de l'autre les réponses qu'il y a de bonnes options.
for-else
est plus compliqué, plus difficile à lire, et probablement plus abusé (si ce n'est carrément une erreur) que nommé boucles serait. Je pense que j'aurais utilisé un autre mot-clé queelse
- peut-être quelque chose commeresume
aurait été bon? Vousbreak
dans la boucle et laresume
est à droite après il?Je pense que vous pourriez faire quelque chose comme ceci:
for
,else
avant (et je pense même que la plupart des gens qui ont ne peut pas se souvenir sur le dessus de leur tête, comment il fonctionne).Une autre façon de traiter ce genre de problème est l'utilisation d'Exception().
Par exemple:
résultat:
En supposant que nous avons envie de sauter à l'extérieur de la n de la boucle de boucle m si m =3:
résultat:
Lien de référence:http://www.programming-idioms.org/idiom/42/continue-outer-loop/1264/python
Nous voulons trouver quelque chose et puis arrêtez l'intérieur de l'itération. J'utilise un système de drapeau.
False:continue
, c'est... rare de mise en forme. Comme c'est souvent le cas dans "naturelle" des systèmes où l'exponentielle sont la norme, vous n'avez qu'à avoir de la chance à quelques reprises sur AFIN d'amasser quantité importante de points de réputation. De toute façon, mes "meilleures" réponses sont généralement les moins populaires.Je pense que l'un des moyens les plus simples d'y parvenir est de remplacer "continuer" avec "break" de l'énoncé,c'est à dire
Pour exemple, voici le code facile de voir comment il va sur:
J'ai juste fait quelque chose comme cela. Ma solution était de remplacer l'intérieur de la boucle avec une compréhension de liste.
où op est certains opérateur booléen agissant sur une combinaison de ii et jj. Dans mon cas, si l'une de ces opérations a renvoyé true, j'ai été fait.
Ce n'est vraiment pas différent de casser le code dans une fonction, mais je pensais qu'en utilisant le "tout" de l'opérateur de faire un OU logique sur une liste de booléens et de faire de la logique dans une seule ligne a été intéressant. Il évite aussi l'appel de la fonction.