222 votes

Python: Poursuivre jusqu'à la prochaine itération dans la boucle externe

Je voulais savoir s'il existe des moyens intégrés pour continuer à la prochaine itération en boucle externe en python. Par exemple, considérons 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 de drapeau), mais existe-t-il un moyen simple de le faire, ou s'agit-il de demander trop?

239voto

culebrón Points 5361
 for ii in range(200):
    for jj in range(200, 400):
        ...block0...
        if something:
            break
    else:
        ...block1...
 

Break cassera la boucle interne et block1 ne sera pas exécuté (il ne sera exécuté que si la boucle interne est sortie normalement).

62voto

Dave Webb Points 90034

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é:

Cependant, je suis de rejet sur la base de ce code si compliqué à besoin de cette fonctionnalité est très rare. Dans la plupart des cas, il existe des des solutions de rechange que produire du code propre, par exemple à l'aide de "retour". Alors que je suis sûr qu'il y a quelques (rares) cas où la clarté de l' code souffrirait d'un refactoring qui rend possible l'utilisation d' de retour, cela est compensé par deux questions:

  1. La complexité ajoutée à la langue, en permanence. Cela affecte pas seulement toutes les implémentations de Python, mais aussi la source de l'outil d'analyse, plus de cours tous les documents de la langue.

  2. Je m'attends à ce que la fonctionnalité sera abusé plus que utilisé correctement, conduisant à une nette diminution dans le code de la clarté (mesurée à travers tous les code Python écrit désormais). Paresseux programmeurs sont partout, et avant que vous savez que vous avez un incroyable désordre sur vos mains de inintelligible code.

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.

23voto

asmeurer Points 13185

Je pense que vous pourriez faire quelque chose comme ça:

 for ii in range(200):
    restart = False
    for jj in range(200, 400):
        ...block0...
        if something:
            restart = True
            break
    if restart:
        continue
    ...block1...
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X