Вам нужно сделать пару вещей, а сейчас вы должны сделать их явными:
Ваша программа должна работать вечно или до тех пор, пока ей не сообщат о выходе.
Ваш запрос на выбор меню должен повторяться до тех пор, пока он не получит правильный ответ.
Ваши входные данные для числовых значений должны повторяться до тех пор, пока они не получат правильные ответы.
Общая форма решения
Как вы можете это делать?Как правило, начиная с неверных исходных данных и повторяя их до тех пор, пока вы не увидите хорошие данные:
some_value = bad_data()
while some_value is bad:
some_value = input("Enter some value: ")
Хорошее значение по умолчанию для bad_data()
- это специальное значение None
.Вы можете написать:
some_value = None
С другой стороны, вашему тесту is bad
может потребоваться другой тип неверных данных, например строка.Вы можете рассмотреть возможность использования ''
в качестве неверного значения данных:
some_value = ''
Наконец, если ваш is bad
тест требует целочисленного значения, возможно, стоит рассмотреть использование числа, которое вы считаете неправильным, или числа издиапазон (например, отрицательное значение):
some_value = 100
# or
some_value = -1
Для ваших конкретных проблем:
1.Как мне работать вечно?
Вы можете работать вечно, используя цикл while
, который никогда не завершается.Цикл while будет работать до тех пор, пока условие выполнено.Есть ли значение, которое всегда верно в Python?Да!Его имя True
:
while True:
# runs forever
2.Как выполнить цикл, пока мой выбор меню не будет действительным?
Использование общей формы, приведенной выше, для целочисленного выбора.Ваше меню просит пользователя ввести номер.Вы можете проверить допустимое значение, используя str .isdigit()
или try:/except:
.В python исключение - лучший выбор:
choice = -1 # Known bad value
while choice not in {1, 2, 3, 4}: # {a,b,c} is a set
instr = input('Choose 1..4')
try:
choice = int(instr)
except:
choice = -1
3.Как я могу выполнить цикл, пока не получу действительное числовое значение?
Для чисел с плавающей запятой, таких как температура, вы не хотите пытаться изложить явный набор разрешенных ответов или диапазон значенийномера.Вместо этого используйте None
(вы можете использовать Nan
, но это больше символов для того же результата).
temp = None
while temp is None:
instr = input('Enter a temp: ')
try:
temp = float(instr)
except:
temp = None
Имейте в виду, что 'nan' является допустимым значением с плавающей точкой.Так что вы можете проверить это и запретить.
Как мне объединить все эти вещи?
Вы собрали их вместе в блоки:
while True: # run forever
# Menu choice:
choice = -1 # Known bad value
while choice not in {1, 2, 3, 4}: # {a,b,c} is a set
instr = input('Choose 1..4')
try:
choice = int(instr)
except:
choice = -1
if choice == 1:
# Now read temps
temp = None
while temp is None:
instr = input('Enter a temp: ')
try:
temp = float(instr)
except:
temp = None