2013-05-20 22 views
6

W poniższym kodzie, chciałbym pętli while aby wyjść jak najszybciej a + b + c = 1000. Jednak testy z instrukcjami print pokazują, że trwa to tylko do wykonania pętli for. Próbowałem już while True, a następnie w zestawie zestaw False, ale powoduje nieskończoną pętlę. Myślałem, że przy użyciu x = 0, ustawienie x = 1 może działać, ale to też działa, aż do zakończenia pętli for. Jaki jest najlepszy i najszybszy sposób na wyjście? Dzięki.Wyjście pętli while w Pythonie

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

ignorując kwestię pętli ... masz zamiar mieć pływający problemy Chodzi o ... konkretnie, c jest zmiennoprzecinkowych # i tak będziesz chciał albo: zaokrąglić, rzucić, albo sprawdzić, czy abs (a + b + c-1000) <0.00001 (lub inny epsilon). Albo mógłbym być całkowicie w błędzie. – Foon

+0

'c' jest unoszące się, ale nie miało to znaczenia. Program znajduje 'a + b + c = 1000' więc najwyraźniej nie dba o' 1000' kontra '1000.0'. Warto wiedzieć, ponieważ czasami może to być problem. – caadrider

Odpowiedz

6

Pętla while dopasuje stan tylko wtedy, gdy sterowanie powraca z powrotem do niego, tzn gdy for pętle są wykonywane całkowicie. Dlatego właśnie Twój program nie wychodzi natychmiast, mimo że warunek został spełniony.

Ale w przypadku, gdy warunek nie był spełniony dla żadnej wartości a, b, c, wtedy twój kod zakończy się w nieskończonej pętli.

Powinieneś użyć funkcji tutaj, ponieważ instrukcja return zrobi to, o co prosisz.

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) 

Oprócz @Sukrit Kalra na answer, gdzie używał flagi wyjścia można także użyć sys.exit() jeśli program nie ma żadnego kodu po tym bloku kodu.

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 

pomoc na 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

Dziękuję. Jeśli używam funkcji, to w ogóle nie potrzebuję pętli 'while'. Jak rozumiem, funkcja działałaby, dopóki warunek "return" nie zostanie spełniony, a następnie zostanie zakończony. Działa to dobrze, ale tak naprawdę nie pomaga mi zrozumieć, dlaczego moja oryginalna pętla 'while' nie zakończy pracy. – caadrider

+0

To wyjście. Po prostu robi kilka dodatkowych pętli 'for'. –

+0

Twój kod przestanie być wykonywany po zakończeniu pętli 'for'. W postach OP, jeśli jednak warunek "if" nie był spełniony, pętle zaczną się od początku. – pascalhein

1

Można byłaby kod wewnętrzny do funkcji i używać powrót do wyjść:

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 

Wystarczy popatrzeć na this pytanie.

1

Problem polega na tym, że mimo że ustawiono x = 1, gdy a + b + c == 1000, nie zostanie zerwany z dwóch dla pętli, gdy ten warunek zostanie spełniony, a więc pętla while nie wie że x == 1, aż oba kończą pętle. Aby uniknąć tego problemu, możesz dodać wyraźne instrukcje break do pętli for (a jak wskazuje Sukrit Kalra, pętla while staje się niepotrzebna).

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

W tym przypadku nie będziesz potrzebował pętli 'while'. –

+0

Dobrze. Dzięki za wskazanie tego! –

0

Można owinąć try/excep i raise gdy warunek jest spełniony.

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

Będę musiał poczekać, aż mój Python będzie o wiele lepszy dla tego. Dzięki za napiwek. Zajrzę do instrukcji "try". Jeszcze się ich nie nauczyłem. – caadrider

3

Jeśli nie chcesz, aby funkcja (który należy odnieść się do odpowiedzi i Ashwini w tym przypadku), tutaj jest alternatywna implementacja.

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

To działa. Chciałbym, żeby za jednym zamachem można było wyrwać się z zagnieżdżonych pętli. Myślałem, że pętla 'while' zapewni tę opcję, ale jak dotąd nie mogę wymyślić, jak to zrobić. – caadrider

+0

Nie będziesz w stanie szybko wyrwać się z wszystkich zagnieżdżonych pętli. Jeśli jednak jesteś w skrypcie, możesz użyć 'sys.exit()', który przerwie kompletne wykonanie pliku i nie wykona niczego po nim. –

+1

@caadrider Python nie ma instrukcji 'goto', takiej jak' C', więc nie możesz po prostu nagle wyskoczyć z zagnieżdżonych pętli. Dobrą opcją jest tutaj użycie funkcji. –

0

Można użyć instrukcji 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