11
votes

Casser deux pour les boucles

Duplicaté possible: strong>

Comment sortir de plusieurs boucles dans Python? p>

Est-il possible de sortir de deux pour forts> boucles en python?
I.e. P>

for i in range(1,100):  
    for j in range(1,100):  
        break ALL the loops!


1 commentaires

6 Réponses :


34
votes

Non, il n'y a pas de déclaration code> nichée code> dans Python.

Au lieu de cela, vous pouvez simplifier votre fonction, comme ceci: p> xxx pré>

.. Ou placez le code dans sa propre fonction et utilisez retour code>: p> xxx pré>

.. ou utilisez une exception: p>

exitFlag = False
for i in range(1,100):
    for j in range(1,100):
        exitFlag = True
        break
    if exitFlag:
        break


2 commentaires

Une autre option qui manque, le pour / Ça / Continuer .


@ F.J ajouté, merci. Je m'inquiète un peu de la duplication, mais cette question semble plus facile à lire que l'ancien.



2
votes

Non, vous ne pouvez pas spécifier combien de boucles à casser. Placez votre code dans une fonction et utilisez retour .


0 commentaires

1
votes

Une autre option: Utilisez un drapeau variable dans la boucle interne et définissez-le sur true lorsque vous utilisez break . Ensuite, utilisez-le pour break la boucle extérieure.


0 commentaires

1
votes
for i in range(1,100):
    breaking = false
    for j in range(1,100):
        if foundAReasonToBreak:  
            breaking = true
            break
    if breaking:
        break

0 commentaires

5
votes

Plusieurs solutions ont été proposées dans PEP 3136 , mais le BDFL rejeté :

Je l'ai rejeté sur la base du code si compliqué pour exiger cela la fonctionnalité est très rare. Dans la plupart des cas, il y a des travaux existants qui produisent un code de nettoyage, par exemple en utilisant «retour». Pendant que je suis sûr Il y a des cas (rares) réels où la clarté du code serait souffrir d'un refactoring qui permet d'utiliser le retour, cela est compensé par deux questions:

  1. La complexité ajoutée à la langue, en permanence. Cela affecte non seulement toutes les implémentations de Python, mais également tous les outils d'analyse source, plus bien sûr toute la documentation pour la langue.

  2. Je m'attends à ce que la fonctionnalité soit abusée plus qu'elle ne sera utilisée à droite, entraînant une diminution nette de la clarté du code (mesurée à travers Tout le code Python écrit désormais). Les programmeurs paresseux sont partout, et avant de le savoir, vous avez un incroyable gâchis sur vos mains de Code inintelligible.


0 commentaires

1
votes
try:
    for i in range(1,10):
        print i
        for j in range(1,10):
            if j == 5: raise AssertionError
            print j
except AssertionError:  
    pass

print "I'm free"
This is a little distasteful but it does seem to accomplish what you're asking.Edit: I see @phihag posted something similar as I was experimenting.

1 commentaires

N'utilisez pas d'exceptions existantes pour les cas qui ne sont pas identiques au tout, à l'origine de l'exception. Crée le tien.