2017-02-16 11 views
0

Я новичок в Python, и моя будущая лаборатория требует, чтобы я написал код для испытания на столкновение объектов (кругов) на плоскости. Для двух кругов я предлагаю пользователю вводить значения для координат x и y, а также радиусы обоих. В настоящее время я настроен так, что если пользователь пренебрегает вводом значения для любого из трех входов, он возвращает сообщение об ошибке с использованием цикла while. Это прекрасно работает.Два условия для вложенного цикла while в Python?

Однако я также хочу настроить его так, чтобы радиус не мог быть меньше или равен нулю. Я использовал вложенный цикл 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 

Вместо того, чтобы повторять тесты для каждой переменной, используйте отдельную функцию для обработки ввода любой из этих чисел. Не запрашивайте другой номер, пока не будут выполнены все условия. Используйте бесконечный while цикл вы вырваться из (либо с помощью break или с помощью return из функции), когда вход удовлетворяет заданным условиям:

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), если вы считаете, что это было полезно для вас. :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^