2010-07-21 6 views
6

Le code python suivant entraînera l'impression de n (14), à mesure que la boucle for est terminée.Opposé à Python pour ... else

for n in range(15): 
    if n == 100: 
     break 
else: 
    print(n) 

Cependant, ce que je veux est le contraire de cela. Est-il possible de faire une boucle for ... else (ou while ... else), mais seulement exécuter le code else si la boucle a fait break?

+0

Trop fatigué pour écrire un atm de solution, mais en utilisant contextmanagers pourrait être un solut (peut-être plus tard!) ion! Source d'inspiration pourrait être ici: http://stackoverflow.com/a/3171971/1524913 – JeromeJ

Répondre

16

Il n'y a pas for...elseifbreak explicite -comme construire en Python (ou dans une langue que je connaisse) parce que vous pouvez simplement faire ceci:

for n in range(15): 
    if n == 100: 
     print(n) 
     break 

Si vous avez plusieurs break s, mettre print(n) en fonction donc vous Don't Repeat Yourself.

+0

Sûrement pas ce que l'op voulait? –

+4

pourquoi pas? cela a le même effet. Si vous voulez que le code s'exécute quand vous rencontrez une instruction 'break', alors ... exécutez le code avant l'instruction break –

+0

Je n'ai pas vu de construction comme celle-ci, mais vous pouvez toujours utiliser \ * shudders \ *' goto' – NullUserException

6

Un peu plus générique solution en utilisant des exceptions au cas où vous cassez dans plusieurs points dans la boucle et ne voulez pas dupliquer le code:

try: 
    for n in range(15): 
     if n == 10: 
      n = 1200 
      raise StopIteration() 
     if n > 4: 
      n = 1400 
      raise StopIteration() 
except StopIteration: 
    print n 
4

Je n'ai pas vraiment les réponses affichées à ce jour, comme ils ont tous besoin de changer le corps de la boucle, ce qui peut être ennuyeux/risqué si le corps est vraiment compliqué, alors voici un moyen de le faire en utilisant un drapeau. remplacer _break avec found ou quelque chose d'autre sens pour votre cas d'utilisation

_break = True 
for n in range(15): 
    if n == 100: 
     break 
else: 
    _break = False 

if _break: 
    print(n) 

Une autre possibilité si elle est une fonction qui ne fait rien si la boucle ne trouve pas de correspondance, est à return dans le bloc else:

for n in range(15): 
    if n == 100: 
     break 
else: 
    return 
print(n) 
0

que diriez-vous:

for n in range(15): 
    if n == 100: 
     break 
else: 
    print("loop successful") 
if n != range(15)[-1]: 
    print("loop failed") 
+0

Cela donne le mauvais résultat si 'break' se produit dans la dernière itération de la boucle. Il imprimera _both_ "loop successful" et "loop failed" dans ce cas. –