2017-02-16 1 views
0

私はPythonの初心者です。今後のラボでは、飛行機のオブジェクト(円)の衝突テストのコードを書く必要があります。 2つの円については、xとy座標の値と両方の半径を入力するようユーザーに促しています。現在、ユーザーが3つの入力のいずれかの値を入力するのを怠ると、whileループを使用してエラーメッセージが返されるように設定しています。それはうまく動作します。Pythonで入れ子になったwhileループの2つの条件はありますか?

しかし、半径をゼロ以下にできないように設定することも必要です。私は入れ子のwhileループを使用しています。これは私のコードです:

while c_1_x=="" or c_1_y=="" or c_1_r=="": 
    print "Error: please enter a value for each field. If the value is 0, type 0." 
    c_1_x=raw_input("Enter the x coordinate of CIRCLE ONE center:") 
    c_1_y=raw_input("Enter the y coordinate of CIRCLE ONE center:") 
    c_1_r=raw_input("Enter the radius of CIRCLE ONE:") 
    while int(c_1_r<=0): 
     print "Error: radius of circle must be greater than zero." 
     c_1_r=raw_input("Enter the radius of CIRCLE ONE:") 

外部ループが満たされた後、内部ループを分析します。半径の値が< = 0の場合は、エラーメッセージを返します。しかし、それを実行すると、値を入力しても次のステップに進みます(具体的には、半径として値< = 0)。私は、両方の基準が満たされるまで、次のステップに進むことを望んでいません。これどうやってするの?

ありがとうございました!それは有り難いです!正の整数の

+0

変更は 'カッコしばらくint型(c_1_r)<= 0:'! – schwobaseggl

+0

ありがとうございました!私はマルティンの方法を好むが、これは私が望んだことをした! –

答えて

2

あなたのテストは欠陥がある:

int(c_1_r<=0) 

これは整数に<=オペレータのブール結果を変換します。 c_1_rを整数に変換することは決してないので、文字列を0と比較することになります。各変数の

>>> 'Foobar' <= 0 
False 
>>> '-10000' <= 0 
False 

ではなく、繰り返しテストを、これらの数字のいずれかの入力を処理するために別の関数を使用し、:Pythonの2で、数字が文字列の前にソートされているので、これは常に、falseになります。すべての条件が満たされるまで別の番号を要求しないでください。正の整数を入力したときに関数がしか返されますので、

def ask_for_positive_number(prompt): 
    while True: 
     try: 
      number = int(raw_input(prompt)) 
     except ValueError: 
      print('Please enter a valid positive integer') 
      continue 
     if number <= 0: 
      print('Please enter a valid positive integer') 
      continue 
     return number 

c_1_x = ask_for_positive_number("Enter the x coordinate of CIRCLE ONE center:") 
c_1_y = ask_for_positive_number("Enter the y coordinate of CIRCLE ONE center:") 
c_1_r = ask_for_positive_number("Enter the radius of CIRCLE ONE:") 

:入力があなたの条件を満たしたときに(breakを使用したり、関数からreturnを使用してのいずれか)から抜け出す無限whileループを使用します3つの変数すべてに値が割り当てられているかどうかをテストする必要はありません。機能の

デモ:

>>> ask_for_positive_number('Y0!: ') 
Y0!: -1 
Please enter a valid positive integer 
Y0!: foobar 
Please enter a valid positive integer 
Y0!: 42 
42 
+0

ありがとう!あなたのコメントを読んで、Pythonのウェブサイトを参照した後、それは理にかなっています。このコードははるかにかさばりにくく、仕事を完了させます! –

+0

@Chrispy_Chreme 2回以上同じことをしたら、別の機能を使用することをお勧めします。 – PinkFluffyUnicorn

+0

@Chrispy_Chreme:助けになってくれてうれしい!あなたがそれが役に立ったと思ったら、[私の答えを受け入れる](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を自由に感じてください。 :-) –

関連する問題