2013-05-20 12 views
6

a + b + c = 1000のようにすぐにwhileループを終了したいと考えています。しかし、printステートメントでのテストでは、ループが完了するまでそれが続くことが示されています(for)。私はwhile Trueを試してからステートメントセットFalseに設定しましたが、無限ループになります。私はx = 0を使用していると思って、x = 1を設定しても動作するかもしれませんが、それもforループが終了するまで実行されます。退出するのに最も優雅で最速の方法は何ですか?ありがとう。Pythonでexit whileループ

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

あなたはここでのポイントの問題を浮動しているつもりだ... ...具体的には、Cはそう浮動小数点#で、丸めたり、キャストしたり、abs(a + b + c-1000)<0.00001(または他のイプシロン)かどうかをチェックします。あるいは私は完全に間違っているかもしれません。 – Foon

+0

'c'は浮動ですが、それは問題ではないようです。プログラムは 'a + b + c = 1000'を見つけて、明らかに' 1000'対 '1000.0'を気にしません。それは時々問題になる可能性があるので、よく分かります。 – caadrider

答えて

6

whileループバックそれに戻る、forループが完全に実行されるすなわちだけ条件に一致します。したがって、条件が満たされてもプログラムがすぐに終了しないのはこのためです。

しかし、aの値に条件が満たされなかった場合、b,cのコードは無限ループになります。

returnステートメントはあなたが求めていることを行うため、ここで関数を使用する必要があります。

別に、彼はあなたのプログラムがそのコードブロックの後に任意のコードを持っていない場合、あなたも sys.exit()を使用することができ、出口フラグを使用@Sukrit Kalraの answerから
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) 

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 

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

ありがとうございます。私が関数を使用すると、 'while'ループはまったく必要ありません。私が理解するように、関数は 'return'の条件が満たされて終了するまで実行されます。それは正常に動作しますが、私の元の 'while'ループがなぜ終了しないのかを理解する助けにはなりません。 – caadrider

+0

終了します。余分な 'for'ループを実行するだけです。 –

+0

あなたのコードは 'for'ループが終了すると実行を停止します。しかし、OPの投稿では、いずれの場合でも「if」条件が満たされなかった場合、ループは最初からやり直されます。 – pascalhein

1

あなたが関数に内部コードをリファクタリングして終了への復帰を使用することができます。

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 

this質問を見てください。

1

問題は、a + b + c == 1000のときにx = 1に設定しても、条件が満たされたときに2つのforループから脱落しないため、whileループはわからない両方のループが終了するまで、x == 1にします。この問題を回避するために、明示的なbreak文をforループに追加することができます(Sukrit Kalraが指摘するように、whileループは不要になります)。

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

この場合、実際にはwhileループは必要ありません。 –

+0

右。それを指摘してくれてありがとう! –

0

条件が満たされたとき、あなたはtry/excepraiseでラップすることができます。

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

私はPythonがこれよりずっと良くなるまで待たなければなりません。しかし、チップをありがとう。私は 'try'ステートメントを調べます。まだそれらを学んでいない。 – caadrider

3

関数を作成したくない場合(その場合はAshwiniの答えを参照してください)、ここでは別の実装があります。

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

それは動作します。 1つのネストされたループから脱出する方法があったのであれば、私は急いでしまいました。 whileループはそのオプションを提供すると思っていましたが、今のところ私はそれを動作させる方法を理解できません。 – caadrider

+0

ネストされたすべてのループから速やかに逸脱することはできません。しかし、スクリプトを使っているなら、 'sys.exit()'を使うことができます。これは、ファイルの完全な実行から抜け出し、その後ろに何も実行しません。 –

+1

@caadrider Pythonは 'C'のような' goto'文を持っていないので、突然ネストされたループから飛び出すことはできません。だからここで良いオプションは関数を使うことです。 –

0

あなたは、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