2013-05-20 5 views
6

Nel codice seguente, desidero uscire dal ciclo while non appena a + b + c = 1000. Tuttavia, il test con le dichiarazioni print mostra che continua fino a quando i loop for non sono terminati. Ho provato while True e quindi nel set di istruzioni ifFalse ma che risulta in un ciclo infinito. Ho pensato che l'utilizzo di x = 0 e quindi l'impostazione di x = 1 funzionasse, ma anche quello funziona fino al termine dei cicli for. Qual è il modo più aggraziato e veloce per uscire? Grazie.Exit while loop in Python

a = 3 
b = 4 
c = 5 
x = 0 
while x != 1: 
    for a in range(3,500): 
     for b in range(a+1,500): 
      c = (a**2 + b**2)**0.5 
      if a + b + c == 1000: 
       print a, b, c 
       print a*b*c 
       x = 1 
+3

ignorando il problema del ciclo ... si sta andando ad avere problemi di floating point qui ... in particolare, c è un virgola mobile # e così dovrai: arrotondarlo, lanciarlo o controllare se abs (a + b + c-1000) <0,00001 (o qualche altro epsilon). O potrei essere totalmente in errore. – Foon

+0

'c' è mobile, ma non sembra avere importanza. Il programma trova un 'a + b + c = 1000', quindi a quanto pare non interessa' 1000' contro '1000.0'. Buono a sapersi, perché a volte potrebbe essere un problema. – caadrider

risposta

6

Il ciclo while corrisponderà la condizione solo quando il controllo ritorna di nuovo esso, cioè quando i for loop vengono eseguiti completamente. Quindi, ecco perché il tuo programma non esce immediatamente anche se la condizione è stata soddisfatta.

Ma, nel caso in cui la condizione non è stata soddisfatta per tutti i valori di a, b, c quindi il codice finirà in un ciclo infinito.

Dovresti utilizzare una funzione qui perché la dichiarazione return farà ciò che stai chiedendo.

def func(a,b,c): 
    for a in range(3,500): 
     for b in range(a+1,500): 
      c = (a**2 + b**2)**0.5 
      if a + b + c == 1000: 
       print a, b, c 
       print a*b*c 
       return # causes your function to exit, and return a value to caller 

func(3,4,5) 

parte @Sukrit Kalra di answer, dove ha usato le bandiere di uscita è anche possibile utilizzare sys.exit() se il programma non ha alcun codice dopo che blocco di codice.

import sys 
a = 3 
b = 4 
c = 5 
for a in range(3,500): 
    for b in range(a+1,500): 
     c = (a**2 + b**2)**0.5 
     if a + b + c == 1000: 
      print a, b, c 
      print a*b*c 
      sys.exit()  #stops the script 

aiuto su sys.exit:

>>> print sys.exit.__doc__ 
exit([status]) 

Exit the interpreter by raising SystemExit(status). 
If the status is omitted or None, it defaults to zero (i.e., success). 
If the status is numeric, it will be used as the system exit status. 
If it is another kind of object, it will be printed and the system 
exit status will be one (i.e., failure). 
+0

Grazie. Se utilizzo una funzione, non ho proprio bisogno del ciclo 'while'. Come ho capito, la funzione dovrebbe funzionare fino a quando non viene soddisfatta la condizione di "return" e poi uscire. Funziona bene, ma in realtà non mi aiuta a capire perché il mio ciclo 'while' originale non uscirà. – caadrider

+0

Esce. Fa solo alcuni loop 'for' in più. –

+0

il tuo codice smetterà di essere eseguito quando i cicli 'for' sono finiti. Nel post dell'OP, tuttavia, se la condizione "if" non è stata soddisfatta in ogni caso, i cicli ricominciano dall'inizio. – pascalhein

1

È possibile refactoring del codice interno in una funzione e l'uso di ritorno per uscire:

def inner(): 
    for a in range(3,500): 
     for b in range(a+1,500): 
      c = (a**2 + b**2)**0.5 
      if a + b + c == 1000: 
       print a, b, c 
       print a*b*c 
       return False 
    return True 

while inner(): 
    pass 

Date un'occhiata al this domanda.

1

Il problema è, anche se si imposta x = 1 quando a + b + c == 1000, non si interrompe i due cicli for quando questa condizione è soddisfatta, e quindi il ciclo while non lo sa che x == 1 fino al termine di entrambi i loop. Per evitare questo problema, è possibile aggiungere istruzioni di interruzione esplicite ai cicli for (e come indicato da Sukrit Kalra, il ciclo while non è necessario).

a = 3 
b = 4 
c = 5 
x = 0 
for a in range(3,500): 
    for b in range(a+1,500): 
    c = (a**2 + b**2)**0.5 
    if a + b + c == 1000: 
     print a, b, c 
     print a*b*c 
     x = 1 
     break 
    if x==1: 
    break 
+0

In questo caso non è necessario il ciclo 'while'. –

+0

Giusto. Grazie per la segnalazione! –

0

È possibile avvolgere con try/excep e raise quando la condizione è soddisfatta.

class FinitoException(Exception): 
    pass 

a = 3 
b = 4 
c = 5 
x = 0 
try: 
    for a in range(3,500): 
     for b in range(a+1,500): 
      c = (a**2 + b**2)**0.5 
      if a + b + c == 1000: 
       print a, b, c 
       print a*b*c 
       raise FinitoException() 
except FinitoException: 
    return # or whatever 
+0

Dovrò aspettare che il mio Python diventi molto migliore per questo. Grazie per il suggerimento però. Osserverò le dichiarazioni 'try'. Non ho ancora imparato quelli. – caadrider

3

Se non si vuole fare una funzione (che si dovrebbe e si riferiscono alla risposta di Ashwini in quel caso), qui è un'implementazione alternativa.

>>> x = True 
>>> for a in range(3,500): 
     for b in range(a+1, 500): 
      c = (a**2 + b**2)**0.5 
      if a + b + c == 1000: 
       print a, b, c 
       print a*b*c 
       x = False 
       break 
     if x == False: 
      break 
200 375 425.0 
31875000.0 
+0

Questo funziona. Vorrei che ci fosse un modo per rompere i loop annidati in un colpo solo. Ho pensato che il ciclo 'while' avrebbe fornito quell'opzione, ma finora non riesco a capire come farlo funzionare. – caadrider

+0

Non sarai in grado di uscire rapidamente da tutti i loop annidati. Tuttavia, se sei in uno script, puoi usare 'sys.exit()' che uscirà dall'esecuzione completa del file e non eseguirà nulla dopo di esso. –

+1

@caadrider Python non ha un'istruzione 'goto' come' C', quindi non è possibile saltare improvvisamente dai loop annidati. Quindi una buona opzione qui è usare le funzioni. –

0

Si potrebbe utilizzare un'istruzione break:

a = 3 
b = 4 
c = 5 
x = 0 
while x != 1: 
    for a in range(3,500): 
     for b in range(a+1,500): 
      c = (a**2 + b**2)**0.5 
      if a + b + c == 1000: 
       print a, b, c 
       print a*b*c 
       break