2017-02-16 63 views
0

我是Python的新手,我即將到來的實驗室要求我爲平面上的對象(圓圈)的碰撞測試編寫代碼。對於兩個圓圈,我提示用戶輸入x和y座標的值以及兩者的半徑。目前,我已經設置了它,以便如果用戶忽略爲三個輸入中的任何一個輸入值,它將使用while循環返回一條錯誤消息。這工作正常。Python中嵌套while循環的兩個條件?

但是,我也想設置它,使得半徑不能小於或等於零。我使用了一個嵌套的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),它也會繼續執行下一步。我不希望它繼續下一步,直到符合BOTH標準。我怎樣才能做到這一點?

非常感謝!我很感激!

+0

變化括號'而INT(c_1_r)<= 0:'! – schwobaseggl

+0

謝謝你的回答!雖然我更喜歡Martijn的方法,但這確實做了我想要的! –

回答

2

您的正整數測試是有缺陷的:

int(c_1_r<=0) 

此轉換布爾結果<=運營商的整數。你永遠不會將c_1_r轉換成一個整數,所以你在那裏比較字符串0。這將始終是假的,因爲在Python 2,數字串排序前:

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

每個變量,而不是重複測試,使用一個單獨的函數來處理的這些數字的任何輸入。在所有條件都滿足之前,不要再要求另一個號碼。 (通過使用break或使用return從功能)當輸入滿足您的使用條件下無限while循環您擺脫:

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:") 

從什麼時候開始已經進入了一個正整數的功能將只返回,沒有必要測試所有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)。 :-) –